假设,我有一个简单的方法:
public int add(int a, int b) {
return a + b;
}
如果我用max int值运行它
add(2147483647, 2147483647);
我得到-2
。我发现如果我们溢出int,那么我们转到最小整数值(-2147483648
)并继续添加。
让我们做一些数学运算。如果我添加2147483647 + 2147483647
,我应该得到-1,因为
-2147483648 + 2147483647 = -1
那我为什么要-2
?
答案 0 :(得分:6)
这样想:
2147483647 + 2147483647
= 2147483647 + ( 1 + 2147483646 )
= ( 2147483647 + 1 ) + 2147483646
= -2147483648 + 2147483646 // Because of overflow
= -2
也就是说,要让左手2147483647溢出,你必须向它添加1。那个1来自右侧2147483647,所以现在只剩下2147483646了。
当然,在内部它是通过2s补充添加完成的,而不是在你到达终点之前添加1。以上只是澄清了数学。
答案 1 :(得分:5)
让我们做一些数学。最大值为2147483647
,但最小值为-2147483648
。
2147483647 + 1 = -2147483648
2147483647 + 2 = -2147483647
...
2147483647 + n = -2147483648 + n - 1
n
= 2147483647
给我们
2147483647 + 2147483647 = -2147483648 + 2147483647 - 1 = -1 - 1 = -2