(整数的最大值 + 1)+(整数的最大值 + 1)= 0?

(Integer's max value + 1) + (Integer's max value + 1) = 0?

基本上,一个整数的最大值是2147483647,最小值是-2147483648,这使得当你对整数的最大值加1时,它就变成了整数的最小值。

如果我输入 int 的最大值(我使用 'max' 如下):

(max+1) + (max+1)

结果为0。

显然加号反转为减号。为什么?这背后的理论是什么?

假设int是32位2的补码,则

max = 2³¹-1

max + 1 = 2³¹(或-231,如果你使用环绕式有符号算术)

因此

(max + 1) + (max + 1) = 2 × 231 = 232

其中 所有低 32 位为零。如果您正在进行非扩展加法(例如在高级语言中如何进行加法),那么底部的 32 位将被截断,结果为零

换句话说,结果模232等于零

既然你已经理解了整数的话题overflow/underflow,那么让我们看一下数学。

为了论证,我们只说最小整数是 -8,最大整数是 7。因此我们会得到以下减少:

given (max + 1) + (max + 1) using integer overflow/underflow
= (7 + 1) + (7 + 1)
= (-8) + (-8)
= -8 + -1 + -7
= 7 + -7
= 0

当您将 -1 加到 -8 上时,您实际上是从 -8 中减去 1,结果为 -9。因为这是一个下溢,答案变成了 7。所以当你从 7 中减去 7 时,你得到 0。

如果我们用二进制补码查看它,它看起来像这样:

given (max + 1) + (max + 1) using integer overflow/underflow
= (0111 + 0001) + (0111 + 0001)
= (1000) + (1000)
= 1000 + 1111 + 1001
= 0111 + 1001
= 0000

二进制数学实际上取决于您如何存储整数的符号。就像我说的,我们这里用的是双恭维,但是还有其他的方法,比如一个的恭维,还有 Excess-K。