定點數加減法及其溢出判斷原理


定點數補碼加減法及其溢出判斷原理

補碼加減運算

補碼的數學表示

設X為一個數的真值,\(M=2^n\)(n為機器位數),則在數學表示上
\([X]_補 = M+X\ (mod M),-2^{n-1}\le X < 2^{n-1}\)

補碼加法

\([X]_補 + [Y]_補 = M+X+M+Y(mod M)=M+X+Y(mod M)=[X+Y]_補\)
可見,補碼加法直接使用加法器相加即可

補碼減法

\([X]_補-[Y]_補=M+X-M-Y=X-Y(mod M)=M+X+M-Y(mod M)=[X]_補+[-Y]_補\)
補碼減法可以轉化為補碼加法,這也是計算機可以只設計加法器而不一定需要減法器的原因
如何將\([Y]_補\)\([-Y]_補\)進行轉化是補碼減法的重點
\([Y]_補=Y_nY_{n-1}\dots Y_1\)
(1)當\(0\le Y < 2^{n-1}\)

\[[Y]_補=[Y]_原=0,Y_{n-1}Y_{n-2}\dots Y_1\\ [-Y]_原=1,Y_{n-1}Y_{n-2}\dots Y_1\]

Y為正,-Y為負,則

\[[-Y]_補=1,\overline{Y_{n-1}}\ \overline{Y_{n-2}}\dots \overline{Y_1} + 1 \]

(2)當 \(-2^{n-1} <Y < 0\)

\[[Y]_補=1,Y_{n-1} Y_{n-2}\dots Y_1 \\ [Y]_原=1,\overline{Y_{n-1}}\ \overline{Y_{n-2}}\dots \overline{Y_1} + 1 \\ [-Y]_原=0,\overline{Y_{n-1}}\ \overline{Y_{n-2}}\dots \overline{Y_1} + 1 \]

Y為負,-Y為正,則

\[[-Y]_補=[-Y]_原=0,\overline{Y_{n-1}}\ \overline{Y_{n-2}}\dots \overline{Y_1} + 1 \]

綜上所述:機器負數轉換方法為
$$[-Y]_補=\sim [Y]_補 + 1$$

溢出判斷

溢出產生的原因

由於機器存放數字的二級制數碼位數有限,當進行模M加法時會出現異常的符號改變現象,稱為溢出。溢出分為以下兩種:

  1. 正溢:兩個整數相加得到一個負數
  2. 負溢:兩個負數相加得到一個負數

溢出檢測

假設加法情況如下:

\[操作數A:[X]_補=X_{n}X_{n-1}\dots X_1\\ 操作數B:[Y]_補=Y_{n}Y_{n-1}\dots Y_1\\ 兩數和:[S]_補=S_{n}S_{n-1}\dots S_1 \]

方法一:直接檢測

當A>0,B>0但S<0時或A<0,B<0但S>0時顯然發生了溢出,表示為:

\[溢出=X_nY_n\overline{S_n} + \overline{X_n}\ \overline{Y_n} S_n \]

方法二:進位檢測

假設兩數運算時產生的進位分別是$$C_{n}C_{n-1}\dots C_1$$
那么根據剛才的討論可以得到

  1. 當A>0,B>0但S<0時,\(A_n=0,B_n=0,S_n=1\),即n-1位發生進位,n位不可能進位,\(C_{n-1}=1,C_{n}=0\);此時正溢
  2. 當A<0,B<0但S>0時,\(A_n=1,B_n=1,S_n=0\),即n位發生進位,n-1位不可能進位,\(C_{n}=1,C_{n-1}=0\);此時負溢
  3. 當A>0,B>0但S>0時,\(A_n=0,B_n=0,S_n=0\),即均不進位,\(C_{n-1}=0,C_{n}=0\);此時不溢出
  4. 當A<0,B<0但S<0時,\(A_n=1,B_n=1,S_n=1\),即均進位,\(C_{n-1}=1,C_{n}=1\);此時不溢出

綜上所述,那么可以得到$$溢出=C_{n-1} \oplus C_n $$

方法三:雙進位檢測

在運算時臨時將兩操作數的符號位復制一位補在最高位+1的位置
這樣運算就會變成

\[操作數A:[X]_補=X_{n}X_{n}X_{n-1}\dots X_1\\ 操作數B:[Y]_補=Y_{n}Y_{n}Y_{n-1}\dots Y_1\\ 兩數和:[S]_補=S_{n2}S_{n1}S_{n-1}\dots S_1 \]

根據\(S_{n2}S_{n1}\)的不同結果,我們就可以判斷是否發生溢出,這個原理與進位檢測其實是相同的

\[ S_{n2}S_{n1}=00;無溢出\\ S_{n2}S_{n1}=01;正溢\\ S_{n2}S_{n1}=10;負溢\\ S_{n2}S_{n1}=11;無溢出\\ \]

為了節約存儲位數,最后保存結果時會忽略最高位的\(S_{n2}\)的計算結果,僅在運算時擴充為雙符號位


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM