Ich habe ein unerwartetes Verhalten festgestellt (unerwartet im Verhältnis zu meinen persönlichen Erwartungen) und frage mich, ob etwas in der JVM fehlerhaft ist oder ob dies möglicherweise ein Randfall ist, in dem ich einige Details nicht genau verstehe soll passieren. Angenommen, wir hätten den folgenden Code in einer Hauptmethode für sich:
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
Eine naive Erwartung wäre, dass dies gedruckt wird Integer.MAX_VALUE-1
, die größte sogar darstellbar int
. Ich glaube jedoch, dass Ganzzahlarithmetik in Java "rollover" soll, daher sollte das Hinzufügen von 1 zu Integer.MAX_VALUE
führen Integer.MIN_VALUE
. Da Integer.MIN_VALUE
immer noch kleiner als ist Integer.MAX_VALUE
, würde die Schleife die negativen geraden Ints weiter durchlaufen. Schließlich würde es auf 0 zurückkehren, und dieser Vorgang sollte sich als Endlosschleife wiederholen.
Wenn ich diesen Code tatsächlich ausführe, erhalte ich nicht deterministische Ergebnisse. Das Ergebnis, das gedruckt wird, liegt in der Regel in der Größenordnung von einer halben Million, aber der genaue Wert variiert. Die Schleife endet also nicht nur, wenn ich glaube, dass es eine Endlosschleife sein sollte, sondern sie scheint zufällig zu enden. Was ist los?
Ich vermute, dass dies entweder ein Fehler in der JVM ist oder dass eine Menge funky Optimierungen stattfinden, die dieses erwartete Verhalten bewirken. Welches ist es?