定点数补码加减法及其溢出判断原理
补码加减运算
补码的数学表示
设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}\)的计算结果,仅在运算时扩充为双符号位