1

私はコードスニペットを持っています:

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

上記のプログラムの出力は次のとおりです。2147483647

なんでそうなの?

イデオンのコード

4

5 に答える 5

10

xデクリメントされてからアンダーフローし、Integer.MAX_VALUE

于 2013-09-19T11:17:48.807 に答える
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 の場合、print ステートメントが実行されます。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 に答える