(整数的最大值 + 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。
基本上,一个整数的最大值是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。