我有一段代码片段:
class WhileTest
{
public static void main(String s[])
{
int x=12;
while(x<13)
{
x--;
}
System.out.println(x);
}
}
上述程序的输出是:2147483647
为什么会这样?
答案 0 :(得分:10)
x
递减,然后下溢到达Integer.MAX_VALUE
答案 1 :(得分:1)
注意x = 12,你继续减去。这导致x 始终小于13.这是直到发生整数溢出(当x达到最低可能的int(Integer.MIN_VALUE))时,数字回绕到最大可能的整数( Integer.MAX_VALUE)大于13且循环结束。
答案 2 :(得分:1)
每次迭代都会减少x
。
x = -2147483648
时(MIN_VALUE of Integer)
x--
的下一步将设置x = +2147483647
(MAX_VALUE of Integer),因为溢出(或下溢,无论你怎么称呼它)。
从2147483647 < 13 = false
开始,您会看到println
答案 3 :(得分:1)
每次迭代都会减小x的大小,所以理论上x永远不会大于或等于13,对吗?
当然,如果整数表现得像整数一样。但他们没有。 Int具有最大和最小尺寸,因为它们存储在您的计算机中。在Java中,int是32位带符号的数字; int的最大大小为2 ^ 31-1;它的最小尺寸是-2 ^ 31。
当x是该循环中的最小大小-2 ^ 31时会发生什么? -2 ^ 31-1&lt; 13,为什么循环条件失败?该数字不能用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时,将运行print语句。什么是2 ^ 31 - 1的价值? 2147483647
答案 4 :(得分:0)
int值转到Integer.MIN_VALUE,下溢并转到Integer.MAX_VALUE,这就是你所看到的。