1

我有一个代码片段:

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

上述程序的输出是:2147483647

为什么这样?

ideone上的代码

4

5 回答 5

10

x递减,然后下溢到达Integer.MAX_VALUE

于 2013-09-19T11:17:48.807 回答
1

你减少x每次迭代。

x = -2147483648(即Integer 的 MIN_VALUE)下一步x--将设置x = +2147483647(即Integer 的 MAX_VALUE),因为上溢(或下溢,但是你称之为)。

因为2147483647 < 13 = false你会看到println

于 2013-09-19T11:18:53.720 回答
1

每次迭代都会减小 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

于 2013-09-19T11:27:13.850 回答
1

请注意,x = 12,并且您继续减去。这导致 x始终小于 13。直到发生整数溢出(当 x 达到可能的最低 int (Integer.MIN_VALUE) 时),并且数字环绕到更大的可能整数 (Integer.MAX_VALUE)大于 13 并且循环结束。

于 2013-09-19T11:18:29.917 回答
0

int 值变为 Integer.MIN_VALUE,下溢并变为 Integer.MAX_VALUE,这就是您所看到的。

于 2013-09-19T11:18:11.207 回答