我们是否忽略二进制补码中的溢出

Do we ignore overflow in Two's Complement

我正在尝试解决二进制补码内的溢出问题,例如我正在尝试删除这两个二进制数: 1111 1000 0100 - 010 111 001 000

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

简答:

如果您对固定宽度的二进制数执行算术运算,对负数使用二进制补码表示,那么是的,您可以忽略一位溢出。

长答案:

你可以考虑n中的每个i位二进制补码符号的位值为2^i ,对于 0 <= i < n - 1,带位 n - 1(符号位)的位值为 -2^(n - 1)。这是符号位的 negative 位值。如果你计算两个这样的数字的总和,就好像它们是无符号 n 位二进制数一样,这些情况很好:

  • 符号位未在加数或结果中设置(重新解释为二进制补码表示),
  • 符号位恰好设置在一个加数中,而不管溢出(如果发生则忽略),或
  • 符号位在两个加数(因此存在溢出,被忽略)和结果中设置。

要理解这一点,将问题视为两个单独的总和可能更容易:符号位的总和和值(其他)位的总和。值和的溢出产生位值为 2^(n-1) 的溢出位——正好是符号位位值的倒数——因此这样的溢出取消一个符号位。

negative + negative case需要这样的取消才能表示结果(两个符号位+一个值溢出=一个符号位),而positive + positive case不能容纳这样的取消,因为没有符号位可被取消。在正 + 负的情况下,恰好在结果为非负的情况下,值位和会溢出;您可以考虑取消负加数的符号位,其结果与忽略整个无符号和的溢出并将该和重新解释为二进制补码的结果相同。

其余情况产生的数学结果无法用 n 位二进制补码格式表示——要么大于最大可表示数,要么小于最小数。如果您忽略溢出,那么可以通过明显的符号翻转来识别此类结果。你用那个做什么是错误恢复策略的问题。

根据 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