Я заметил какое-то неожиданное поведение (неожиданное относительно моих личных ожиданий), и мне интересно, есть ли что-то, если есть ошибка в JVM или, возможно, это незначительный случай, когда я не понимаю некоторые детали о том, что именно должно произойти. Предположим, что в основном методе у нас был следующий код:
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
, цикл будет повторять отрицательные четные числа. В конце концов он вернется к 0, и этот процесс должен повториться как бесконечный цикл.
Когда я на самом деле запускаю этот код, я получаю недетерминированные результаты. Результат печати обычно составляет порядка полумиллиона, но точное значение варьируется. Таким образом, цикл не только заканчивается, когда я считаю, что это должен быть бесконечный цикл, но, кажется, он прерывается случайно. Что происходит?
Я предполагаю, что это либо ошибка в JVM, либо происходит много лишних оптимизаций, приводящих к такому ожидаемому поведению. Что это?