我在一本计算机体系结构教科书中遇到了这个问题:
从另一个严格负整数(二进制补码)中减去一个严格负整数永远不会溢出。
教科书没有继续解释这个断言。它激起了我的好奇心。
为什么这个说法是真的?
我在一本计算机体系结构教科书中遇到了这个问题:
从另一个严格负整数(二进制补码)中减去一个严格负整数永远不会溢出。
教科书没有继续解释这个断言。它激起了我的好奇心。
为什么这个说法是真的?
这是 32 位整数的工作原理。对于任何其他位长度,它的工作原理都是一样的。
最大的负数是-1。
最小的负数是-2^31。
如果结果大于或等于 2^31 或小于 -2^31,则会发生溢出。
通过从最大的数字中减去最小的数字,您可以获得最大的减法结果。-1 - (-2^31) = 2^31 - 1。这已经足够小了。
通过从最小的数字中减去最大的数字,您可以得到最小的减法结果。-2^31 - (-1) = -(2^31 - 1)。这大于 -2^31。
这种减法可以得到的数字范围是[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
to -(MAX_INT+1)
,因此两个这样的数字之间可能的差异范围是-MAX_INT
to MAX_INT
。由于这个范围很容易表示(记住完整的有符号整数范围是-(MAX_INT+1)
to MAX_INT
),那么显然永远不会有溢出。