J'ai remarqué un comportement inattendu (inattendue par rapport à mes attentes personnelles), et je me demandais si quelque chose si il y a un bug dans la JVM ou si c'est peut-être une frange cas où je ne comprends pas certains détails exactement ce qui est censé se produire. Supposons que nous ayons le code suivant dans la méthode main par lui-même:
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
Le naïf espoir serait que ce serait d'imprimer Integer.MAX_VALUE-1
, le plus grand même représentable int
. Cependant, je crois que l'arithmétique des nombres entiers est censé "rollover" en Java, donc, l'ajout de 1 Integer.MAX_VALUE
devrait entraîner Integer.MIN_VALUE
. Depuis Integer.MIN_VALUE
est encore moins Integer.MAX_VALUE
, la boucle se garder d'une itération dans le négatif, même ints. Finalement, il serait revenir à 0, et ce processus doit se répéter comme une boucle infinie.
Lorsque j'ai fait d'exécuter ce code, j'obtiens non-déterministe résultats. Le résultat est imprimé tend à être de l'ordre de un demi-million de dollars, mais la valeur exacte varie. N'est donc pas seulement la boucle s'arrêter quand je pense qu'elle doit être une boucle infinie, mais il semble pour mettre fin au hasard. Ce qui se passe?
Ma conjecture est que c'est soit un bug dans la JVM, ou il y a beaucoup de funky optimisation en cours qui ont fait de ce comportement attendu. Qui est-il?