我有一个代码片段:
class WhileTest
{
public static void main(String s[])
{
int x=12;
while(x<13)
{
x--;
}
System.out.println(x);
}
}
上述程序的输出是:2147483647
为什么这样?
我有一个代码片段:
class WhileTest
{
public static void main(String s[])
{
int x=12;
while(x<13)
{
x--;
}
System.out.println(x);
}
}
上述程序的输出是:2147483647
为什么这样?
x
递减,然后下溢到达Integer.MAX_VALUE
你减少x
每次迭代。
当x = -2147483648
(即Integer 的 MIN_VALUE)下一步x--
将设置x = +2147483647
(即Integer 的 MAX_VALUE),因为上溢(或下溢,但是你称之为)。
因为2147483647 < 13 = false
你会看到println
每次迭代都会减小 x 的大小,所以理论上 x 永远不会大于或等于 13,对吧?
当然,如果 int 的行为就像整数一样。但他们没有。Int 具有最大和最小大小,因为它们在您的计算机中的存储方式。在 Java 中,int 是 32 位有符号数;int 的最大大小为 2^31-1;它的最小尺寸是-2 ^ 31。
当 x 是该循环中的最小尺寸 -2^31 时会发生什么?-2^31 - 1 < 13,那么为什么循环条件会失败呢?该数字不能用 int 表示。int 的行为方式是它们环绕。
int x = Integer.MIN_VALUE; // x = -2^31
x--;
x == Integer.MAX_VALUE; //True. x == 2^31-1
2^21 - 1 大于 13,循环条件失败。当 x 为 Integer.MAX_VALUE 时运行打印语句。2^31 - 1 的值是多少?2147483647
请注意,x = 12,并且您继续减去。这导致 x始终小于 13。直到发生整数溢出(当 x 达到可能的最低 int (Integer.MIN_VALUE) 时),并且数字环绕到更大的可能整数 (Integer.MAX_VALUE)大于 13 并且循环结束。
int 值变为 Integer.MIN_VALUE,下溢并变为 Integer.MAX_VALUE,这就是您所看到的。