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

时间:2016-02-19 06:51:05

标签: theory

基本上,整数的最大值是2147483647,最小值是-2147483648,这使得当你将整数的最大值加1时,它变为整数的最小值。

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

(max+1) + (max+1)

结果为0.

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

2 个答案:

答案 0 :(得分:3)

假设int是32位2的补码,那么

max = 2³¹-1

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

因此

  

(max + 1)+(max + 1)= 2×2 31 = 2 32

全部低32位零。如果你正在进行非加宽的添加(比如在高级语言中如何进行添加),那么底部的32位将被截断,从而导致零

换句话说,它的结果模2 32 等于零

答案 1 :(得分:3)

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

为了论证,我们只说最小整数是-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。