定点补码加减法

补码加减运算的小总结

补码运算方法

加法 [X+Y]= [X] + [Y]
减法 [X-Y]= [X] + [-Y] =[X] - [Y]

tips:
1.补码的符号位参与运算,但是符号位产生的进位要丢弃(此时结果是正确的)。
2.补码运算有可能会产生溢出,此时结果肯定是错误的。(在定点机中,当运算结果发生溢出时表示出错,机器通过逻辑电路自动检查出溢出,并进行中断处理)(这里讨论的是定点补码加减运算,所以不涉及阶码溢出和尾数溢出)

关于进位丢弃

eg:已知X=-01111,Y=+11001,[X-Y]补=?
解:
[X]补=1 10001 ,[-Y]补=1 00111,
相加得10 11000,
此时的最高位的进位1可以直接丢弃吗?
显然不对,因为此时符合溢出条件(Cs⊕Cp =1 具体见下方“溢出判断”),所以直接丢弃的话结果是错误的,应该写成下方这个样子
[X-Y]补=10 11000 (溢出)
(而不是直接把结果写成 0 11000。)

溢出的判断方法:

1.直接判断:两个正数相加,结果得到了负数,是负溢出;两个负数相加,结果得到了正数,是正溢出;
2.Cs表示符号位的进位,Cp表示最高数值位进位,
若 Cs⊕Cp =0 ,无溢出;
若 Cs⊕Cp =1 ,有溢出。
3.双符号位的补码(正数符号位为00,负数符号位为11)运算:
若运算结果的符号位为"01",则正溢;
若结果双符号为10,则负溢出;
若结果的双符号位为00或11,无溢出。
(这一种方法可以这么理解,双符号位(也叫变形补码)的情况下,溢出时会影响较低的符号位,此时可由较高的符号位来判断运算后真实结果的正负,它为0则出现了上溢(正溢),为1则表示出现了下溢(负溢出)。 )

做个比较无聊的事,根据第二个方法( Cs⊕Cp )具体分析一下正数负数相加减时的溢出情况

先用比较笨的方法进行分类讨论:(符号位为 0 表示正数 ,1 表示负数)

正+正 可能溢出
先不考虑数值最高位是否进位,此时符号位为0,
数值最高位产生进位1时,由于符号位为0,符号位不可能再产生进位。
此时符号位未产生进位,数值最高位产生了进位,故满足“Cs⊕Cp =1 ”,是溢出;
正+负 不可能溢出
正数符号位为0 负数符号位为1,结果的符号位在不考虑数值最高位进位时必定为1,
分两种情况讨论,当数值最高位无进位1时,不是溢出(不满足Cs⊕Cp =1 );
当数值最高位有进位1时,这个1会和原本在符号位的1再进行一次进位,此时也不是溢出(不满足Cs⊕Cp =1 );
负+负 有可能溢出
两个符号位的1相加产生的进位丢弃,此时符号位为0,
数值最高位产生进位1时,由于符号位为0,符号位不可能再产生进位。
此时符号位未产生进位,数值最高位产生了进位,故满足“Cs⊕Cp =1 ”,是溢出;
正-负 有可能溢出
补码减法运算时,根据补码的运算方法,不考虑数值最高位是否进位,符号位一定为0两个符号位的1相加产生的进位丢弃,此时符号位为0,
当数值最高位产生进位1时,由于符号位为0,符号位不可能再产生进位。
此时符号位未产生进位,数值最高位产生了进位,故满足“Cs⊕Cp =1 ”,是溢出;
… …

(正-正、负-正、负-负的分析类似)

其实不用总结到最后,写着写着就发现每次判断到(不考虑数值最高位进位情况下)符号位为0时,一定会有溢出的危险;符号位为1时,不会有溢出的可能。(当数值最高位的进位又让符号位进位时,此情此景让人联想到跳棋,当符号位有踏板1时,数值最高位的进位就借着他“跳”走了。)
总结一下—— 同号相加、异号相减 有可能溢出。

reference

《计算机组成原理》(第五版) 白中英 戴志涛 主编 科学出版社出版

你可能感兴趣的:(补码)