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