我试图在两个补码中包围溢出,例如说我试图拿走这两个二进制数: 1111 1000 0100 - 010 111 001 000
我将第二个二进制数转换为它的两个补码等价,然后简单地添加它,但我注意到它导致溢出1,我只是忽略溢出?或者我必须遵守规则吗? 1111 1000 0100 + 1010 0011 1000 =(1)1001 1011 1100
答案 0 :(得分:1)
简答:
如果你对固定宽度二进制数进行算术运算,使用二进制补码表示负数,那么是的,你忽略了一位溢出。
长答案:
您可以在 n -bit中考虑每个 i 位。两个补码表示法的位置值为2 ^ i , 0< = i < n - 1,位 n - 1(符号位)具有位值-2 ^( n - 1)。这是符号位的负位值。如果计算两个这样的数字之和,就好像它们是无符号的 n 位二进制数,这些情况都很好:
要理解这一点,可能更容易将问题视为两个单独的和:符号位的总和,以及值(其他)位的总和。值sum的溢出产生溢出位,其位值为2 ^( n -1) - 恰好是符号位的位值的倒数 - 因此这样的溢出取消一个符号位。
负+负情况需要这样的取消才能表示结果(两个符号位+一个值溢出=一个符号位),而正+正的情况不能适应这种取消,因为没有可用的符号位被取消在正+负情况下,在结果为非负的情况下,值位总和会溢出;您可以考虑取消负加数的符号位,产生与忽略整体无符号和的溢出相同的结果,并将该和重新解释为二进制补码。
其余案例产生的数学结果无法用 n -bit二进制补码格式表示 - 要么大于最大可表示数,要么小于最小值。如果忽略溢出,则可以通过明显的符号翻转识别这样的结果。你用它做的是一个错误恢复策略的问题。
答案 1 :(得分:0)
来自维基百科关于在https://en.wikipedia.org/wiki/Two%27s_complement#Addition添加的部分中2的补充的文章,我的理解是可以忽略超出给定(固定)位长度(向左)的进位但是当进位的最左边两位不同时,不会溢出。这篇文章展示了如何维护一个进位行,以便判断是否存在溢出,这是一个相同风格的简单示例:
在4位2的补码-2中是1110而+3是0011所以
11110 carry
1110 -2
+0011 +3
----
10001 which is 0001 or simply 1 ignoring the carry in bit 5 and is
safe since the leftmost two bits in the carry row are identical