这个程序有什么问题

时间:2013-09-19 11:15:28

标签: java while-loop

我有一段代码片段:

class WhileTest
{
    public static void main(String s[])
    {
        int x=12;
        while(x<13)
        {
            x--;
        }
        System.out.println(x);
    }
}

上述程序的输出是:2147483647

为什么会这样?

Code on ideone

5 个答案:

答案 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 Integerx--的下一步将设置x = +2147483647MAX_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,这就是你所看到的。