Noté un comportamiento inesperado (inesperado en relación con mis expectativas personales), y me pregunto si hay algo si hay un error en la JVM o si quizás se trata de un caso marginal en el que no entiendo algunos de los detalles de qué se supone que sucederá exactamente Supongamos que tenemos el siguiente código en un método principal por sí mismo:¿Es esto un error de JVM o "comportamiento esperado"?
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
Una expectativa ingenua sería que este imprimiría Integer.MAX_VALUE-1
, el más grande, incluso representable int
. Sin embargo, creo que se supone que la aritmética de enteros debe "desplazarse" en Java, por lo que agregar 1 a Integer.MAX_VALUE
debería dar como resultado Integer.MIN_VALUE
. Dado que Integer.MIN_VALUE
es aún menor que Integer.MAX_VALUE
, el ciclo se mantendrá iterando a través de las entradas par negativas. Finalmente, volvería a 0, y este proceso debería repetirse como un ciclo infinito.
Cuando realmente ejecuto este código, obtengo resultados no deterministas. El resultado que se imprime tiende a ser del orden de medio millón, pero el valor exacto varía. Entonces, no solo termina el ciclo cuando creo que debería ser un ciclo infinito, sino que parece terminar de forma aleatoria. ¿Que esta pasando?
Supongo que esto es un error en la JVM, o hay una gran cantidad de optimización funky que hace que este comportamiento esperado. ¿Cuál es?
¿Esto es todo lo que está en su método principal? –
Sí ... ¿eso importa? –
@Michael: simplemente comprobando que no estaba pasando nada de funky. En mi máquina siempre está imprimiendo 2147483640, pero eso todavía es inesperado. –