0

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

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

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

为什么这个说法是真的?

4

3 回答 3

2

这是 32 位整数的工作原理。对于任何其他位长度,它的工作原理都是一样的。

最大的负数是-1。

最小的负数是-2^31。

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

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

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

于 2011-09-25T16:16:46.583 回答
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请注意,“强”<可以防止溢出。

于 2011-09-25T16:16:21.343 回答
0

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

于 2011-09-25T16:17:24.653 回答