予期しない動作(個人的な期待に比べて予期しない)に気づきました。JVMにバグがあるのか、それともこれが正確に何の詳細を理解していないフリンジケースなのか疑問に思います。起こることになっています。mainメソッド自体に次のコードがあるとします。
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
素朴な期待は、これが印刷されることInteger.MAX_VALUE-1
であり、最大でさえ表現可能int
です。ただし、Javaでは整数演算が「ロールオーバー」することになっていると思います。したがって、に1を追加するInteger.MAX_VALUE
と。になりInteger.MIN_VALUE
ます。Integer.MIN_VALUE
はまだより小さいので、Integer.MAX_VALUE
ループは負の偶数intを反復し続けます。最終的には0に戻り、このプロセスは無限ループとして繰り返されるはずです。
このコードを実際に実行すると、非決定論的な結果が得られます。印刷される結果は50万のオーダーになる傾向がありますが、正確な値は異なります。したがって、ループは無限ループであると私が信じるときに終了するだけでなく、ランダムに終了するように見えます。どうしたの?
私の推測では、これはJVMのバグであるか、この予想される動作を実現する多くのファンキーな最適化が行われていると思います。どっち?