簡體   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