public void getSum(int a, int b) {
int x=10;
int y=-5;
int ans = x;
while (y != 0) {
ans++;
y--;
}
System.out.println("ans = " + ans);
}
该程序给出了正确的答案,但我不知道如何。因为y
是-ve
,而我正在做y--
,这使它远离0
而不是朝着它。那么这个程序如何给我正确的答案?
答案 0 :(得分:1)
int
的最大值为2^31-1
,最小值为-2^31
。当值超过这些值时,将发生整数溢出,这意味着您要遍历,它会回绕,并且数字变成相反的符号。 (如果您将最大值加1,它将变成-2147483648
)
让我们换一种说法。设想一个时钟,除了它从0
到2147483647
(在6
所在的地方),然后立即到-2147483648
,然后再回到0
。 (请注意,-2147483648
和2147483647
位于常规时钟上6
的两侧)
(0)
|
(-1073741824) - * - (1073741823)
|
(-2147483648) (2147483647)
因此,假设y
是一只手,从-5
开始并开始向-2147483648
移动,而ans
是10,并且正在向1073741823
移动。随着循环的继续,y
继续沿逆时针方向移动,y
将从-2147483648
传递到2147483647
,最后变为零,退出循环。同时,ans
也将从2147483647
-2147483648
经过,然后在ans == 5
时停止。