Вычислить продукт в Java, термин против цикл ‘for’, разные результаты

#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 умножение, поэтому переполнения нет.