私はコードスニペットを持っています:
class WhileTest
{
public static void main(String s[])
{
int x=12;
while(x<13)
{
x--;
}
System.out.println(x);
}
}
上記のプログラムの出力は次のとおりです。2147483647
なんでそうなの?
私はコードスニペットを持っています:
class WhileTest
{
public static void main(String s[])
{
int x=12;
while(x<13)
{
x--;
}
System.out.println(x);
}
}
上記のプログラムの出力は次のとおりです。2147483647
なんでそうなの?
x
デクリメントされてからアンダーフローし、Integer.MAX_VALUE
反復ごとに 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
x = 12 であり、引き算を続けることに注意してください。これにより、xは常に13 未満になります。これは、整数オーバーフローが発生するまで (x が可能な限り最小の int (Integer.MIN_VALUE) になるとき)、数値は可能な限り最大の整数 (Integer.MAX_VALUE) にラップアラウンドします。 13 よりも大きくなり、ループが終了します。
int 値は Integer.MIN_VALUE になり、アンダーフローして Integer.MAX_VALUE になります。