定点数加减法及其溢出判断原理


定点数补码加减法及其溢出判断原理

补码加减运算

补码的数学表示

设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