我们是否忽略了Two's Complement中的溢出

时间:2015-01-09 18:44:24

标签: binary overflow twos-complement complement

我试图在两个补码中包围溢出,例如说我试图拿走这两个二进制数: 1111 1000 0100 - 010 111 001 000

我将第二个二进制数转换为它的两个补码等价,然后简单地添加它,但我注意到它导致溢出1,我只是忽略溢出?或者我必须遵守规则吗? 1111 1000 0100 + 1010 0011 1000 =(1)1001 1011 1100

2 个答案:

答案 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