我在计算机体系结构教科书中遇到过这个问题:
从另一个严格为负的整数(以二进制补码)减去一个严格的负整数,永远不会溢出。
教科书没有继续解释这个断言。它激起了我的好奇心。
为什么这句话是真的?
答案 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_INT
到MAX_INT
。由于此范围很容易表示(请记住,完整的有符号整数范围是-(MAX_INT+1)
到MAX_INT
),显然永远不会有溢出。