繁体   English   中英

这个程序怎么了

[英]what's wrong with this program

我有一个代码段:

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

上面的程序的输出是: 2147483647

为什么这样?

ideone上的代码

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

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

您每次迭代减少x

x = -2147483648 (它是IntegerMIN_VALUE )时,由于上溢(或下溢,但是您将其称为),因此x--的下一步将设置x = +2147483647 (它是IntegerMAX_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 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

int值转到Integer.MIN_VALUE,下溢并转到您正在查看的Integer.MAX_VALUE。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM