补码加减法

Amber ·
更新时间:2024-09-21
· 781 次阅读

补码加减运算的小总结 补码运算方法
加法 [X+Y]补= [X]补 + [Y]补
减法 [X-Y]补= [X]补 + [-Y]补 =[X]补 - [Y]补

tips:
1.补码的符号位参与运算,但是符号位产生的进位要丢弃(此时结果是正确的)。
2.补码运算有可能会产生溢出,此时结果肯定是错误的。

溢出的判断方法:

1.直接判断:两个正数相加,结果得到了负数,是负溢出;两个负数相加,结果得到了正数,是正溢出;
2.Cs表示符号位的进位,Cp表示最高数值位进位,
若 Cs⊕Cp =0 ,无溢出;
若 Cs⊕Cp =1 ,有溢出。
3.双符号位的补码(正数符号位为00,负数符号位为11)运算:
若运算结果的符号位为"01",则正溢;
若结果双符号为10,则负溢出;
若结果的双符号位为00或11,无溢出。

那么那么根据以上的判断方法,单单考虑 正负数 的补码加减运算,什么时候会产生溢出呢?

先用比较笨的方法进行分类讨论:(符号位为 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

补码加法运算溢出判断


作者:IcynLau



补码

需要 登录 后方可回复, 如果你还没有账号请 注册新账号