关于无符号整数溢出判定规则的疑问与正确性确认
无符号与补码溢出判定规则的确认
你的理解完全正确,教材这里混淆了无符号整数和补码的溢出判定规则,两者的逻辑完全不同:
无符号整数溢出判定:当且仅当最高位的
carry-out(进位输出)为1。
以你举的4位无符号数为例:1111(15) +0001(1),运算时最低位进位逐步传递到最高位,最终最高位产生carry-out=1,此时结果0000超出了4位无符号数的最大值15,确实属于溢出,完全符合这个判定规则。补码(2's complement)溢出判定:才是当最高位的
carry-in(进位输入)与carry-out不匹配。
比如4位补码中,0111(7) +0001(1),最高位carry-in=0、carry-out=1,两者不匹配,此时结果1000(-8)与操作数的正符号矛盾,属于溢出;而1111(-1) +0001(1),最高位carry-in=1、carry-out=1,两者匹配,结果0000(0)是正确的补码结果,没有溢出。
教材错误地将补码的溢出规则套用在了无符号整数上,而无符号整数的溢出本质是运算结果超出了其可表示的数值范围,仅通过最高位的carry-out是否为1就能准确判定。
内容的提问来源于stack exchange,提问作者Addem
相关产品推荐
相关产品推荐

