减去2的负整数(二进制补码)永远不会溢出

时间:2011-09-25 16:11:11

标签: math binary twos-complement negative-number internal-representation

我在计算机体系结构教科书中遇到过这个问题:

  

从另一个严格为负的整数(以二进制补码)减去一个严格的负整数,永远不会溢出。

教科书没有继续解释这个断言。它激起了我的好奇心。

为什么这句话是真的?

3 个答案:

答案 0 :(得分:2)

以下是32位整数的工作原理。对于任何其他位长度,它的工作方式相同。

最大负数为-1。

最小的负数是-2 ^ 31。

如果结果大于或等于2 ^ 31或小于-2 ^ 31,则会发生溢出。

通过从最大数字中减去最小数字,可以获得最大的减法结果。 -1 - (-2 ^ 31)= 2 ^ 31 - 1.这个足够小。

通过从最小的数字中减去最大数字,可以获得最小的减法结果。 -2 ^ 31 - (-1)= - (2 ^ 31 - 1)。这大于-2 ^ 31。

答案 1 :(得分:0)

通过这种减法可以得到的数字范围是[MIN_INT + 1,MAX_INT],因此永远不会溢出。
为什么吗
请让MIN_INT <= x,y < 0 MIN_INT = MIN_INT-0 < x-y < 0-MIN_INT = MAX_INT+1 MIN_INT < x-y < MAX_INT + 1
因此<注意'强'{{1}}防止溢出。

答案 2 :(得分:0)

由于负有符号整数的范围为-1-(MAX_INT+1),因此两个此类数字之间的可能差异范围为-MAX_INTMAX_INT。由于此范围很容易表示(请记住,完整的有符号整数范围是-(MAX_INT+1)MAX_INT),显然永远不会有溢出。