加法 | [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补码加法运算溢出判断