Java中的Int溢出

Fin*_*son 1 java

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

public int add(int a, int b) {
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

如果我用max int值运行它

add(2147483647, 2147483647);
Run Code Online (Sandbox Code Playgroud)

我得到-2.我发现如果我们溢出int然后我们去min integer value(-2147483648)并继续添加.

我们来做一些数学.如果我添加2147483647 + 2147483647我应该得-1,因为

-2147483648 + 2147483647 = -1
Run Code Online (Sandbox Code Playgroud)

那我为什么要这样-2

Rea*_*tic 6

可以这样想:

  2147483647 + 2147483647
= 2147483647 + ( 1 + 2147483646 )
= ( 2147483647 + 1 ) + 2147483646
= -2147483648 + 2147483646  // Because of overflow
= -2
Run Code Online (Sandbox Code Playgroud)

也就是说,要让左手2147483647溢出,你必须向它添加1.那个1来自右侧2147483647,所以现在只剩下2147483646了.

当然,在内部它是通过2s补充加法完成的,而不是在你到达终点时加1.以上只是澄清了数学.


Psh*_*emo 5

让我们做一些数学.Max是2147483647min,但是-2147483648.

2147483647 + 1 = -2147483648
2147483647 + 2 = -2147483647
...
2147483647 + n = -2147483648 + n - 1
Run Code Online (Sandbox Code Playgroud)

哪个为n= 2147483647给我们

2147483647 + 2147483647 = -2147483648 + 2147483647 - 1 = -1 - 1 = -2
Run Code Online (Sandbox Code Playgroud)