假设,我有一个简单的方法:
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?
可以这样想:
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.以上只是澄清了数学.
让我们做一些数学.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)