Java中的Int溢出

时间:2015-09-12 14:04:02

标签: java

假设,我有一个简单的方法:

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

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