4位二进制Two's complement(补码)加法溢出判定疑问
4位补码加法溢出问题解答
核心误区纠正
你混淆了无符号数溢出和补码溢出的判断规则:无符号数只要相加产生最高位进位就算溢出,但补码的最高位进位属于可以丢弃的进位,只有运算结果超出4位补码的表示范围(-8 ~ +7)时才会判定为溢出。
补码溢出的两个快速判断方法:
- 两个同符号数相加,结果的符号和原加数符号相反,一定溢出
- 异号数相加永远不会产生溢出
逐个选项验证
我们先把每个4位二进制补码转成十进制值,再计算判断:
选项A:1011 + 1001
- 加数1:
1011对应十进制-5,负数 - 加数2:
1001对应十进制-7,负数 - 理论和:
-5 + (-7) = -12,小于4位补码最小值-8,超出表示范围 - 实际运算截断4位得到
0100,对应十进制+4,两个负数相加得到正数,符号明显错误,产生溢出
选项B:1100 + 1101
- 加数1:
1100对应十进制-4,负数 - 加数2:
1101对应十进制-3,负数 - 理论和:
-4 + (-3) = -7,在-8 ~ +7范围内 - 实际运算截断4位得到
1001,对应十进制-7,结果正确,无溢出
选项C:0111 + 1000
- 加数1:
0111对应十进制+7,正数 - 加数2:
1000对应十进制-8,负数 - 属于异号相加,天然不会溢出
- 理论和:
7 + (-8) = -1,运算结果为1111,对应十进制-1,结果正确,无溢出
选项D:1010 + 0110
- 加数1:
1010对应十进制-6,负数 - 加数2:
0110对应十进制+6,正数 - 属于异号相加,天然不会溢出
- 理论和:
-6 + 6 = 0,运算截断4位得到0000,结果正确,无溢出
最终结论
只有选项A会产生溢出,你的错误就是把进位直接等同于补码溢出了,补码的进位不代表溢出,只有结果超出表示范围才算。
内容的提问来源于stack exchange,提问作者user16225412
相关产品推荐
相关产品推荐

