#java #for-loop #calculation #term
#java #цикл for
Вопрос:
Рассмотрим:
long y = 1;
for (int i = 49; i > 43; i--) {
y*= i;
}
long x = 49*48*47*46*45*44; // = 1478412928
long y // = 10068347520
Почему результаты отличаются, хотя вычисление равномерное?
Есть ли объяснение?
Ответ №1:
49*48*47*46*45*44
является умножением int
литералов и, следовательно, выполняет int
умножения, приводящие к int
значению. В этом случае он переполняется (поскольку результат больше, чем Integer.MAX_VALUE
), прежде чем вы присвоите результат long
переменной. Следовательно, результат неверен.
Измените его на 49L*48*47*46*45*44
или (long)49*48*47*46*45*44
, чтобы выполнить long
умножение.
С другой стороны, в вашем первом вычислении вы начинаете с long
переменной, значение которой равно 1
, и цикл умножает это long
на int
на каждой итерации, выполняя long
умножение, поэтому переполнения нет.