定點數補碼加減法及其溢出判斷原理
補碼加減運算
補碼的數學表示
設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為負,則
(2)當 \(-2^{n-1} <Y < 0\) 時
Y為負,-Y為正,則
綜上所述:機器負數轉換方法為
$$[-Y]_補=\sim [Y]_補 + 1$$
溢出判斷
溢出產生的原因
由於機器存放數字的二級制數碼位數有限,當進行模M加法時會出現異常的符號改變現象,稱為溢出。溢出分為以下兩種:
- 正溢:兩個整數相加得到一個負數
- 負溢:兩個負數相加得到一個負數
溢出檢測
假設加法情況如下:
方法一:直接檢測
當A>0,B>0但S<0時或A<0,B<0但S>0時顯然發生了溢出,表示為:
方法二:進位檢測
假設兩數運算時產生的進位分別是$$C_{n}C_{n-1}\dots C_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\);此時正溢
- 當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\);此時負溢
- 當A>0,B>0但S>0時,\(A_n=0,B_n=0,S_n=0\),即均不進位,\(C_{n-1}=0,C_{n}=0\);此時不溢出
- 當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的位置
這樣運算就會變成
根據\(S_{n2}S_{n1}\)的不同結果,我們就可以判斷是否發生溢出,這個原理與進位檢測其實是相同的
為了節約存儲位數,最后保存結果時會忽略最高位的\(S_{n2}\)的計算結果,僅在運算時擴充為雙符號位