基本上,整数的最大值是2147483647,最小值是-2147483648,这使得当你将整数的最大值加1时,它变为整数的最小值。
如果我把int的最大值(我使用'max'如下):
(max+1) + (max+1)
结果为0.
显然加号反转为负号。为什么?这背后的理论是什么?
答案 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。