странное поведение java

#java

#java

Вопрос:

здравствуйте, у меня есть вопрос о Java, почему следующий код возвращает странное значение?

 System.out.println("Strange "   (20 * 232792560)/20);
  

почему я получаю 18044195 ?

Ответ №1:

Потому что (20 * 232792560) переполняет диапазон int и несколько раз обводит диапазон чисел, чтобы стать 360883904 . Затем это делится на 20 , чтобы дать вам результат, который вы видите.

Если вы хотите получить правильный результат, то вам нужно сделать:

 System.out.println("Strange "   (20 * 232792560L) / 20);
  

(Пометка литерала символом L означает, что постоянная математика будет выполняться с помощью long , а не с int , так что переполнения больше не будет.)

Ответ №2:

Поскольку (20 * 232792560) будет выполнено умножение на основе целых чисел, а результат, очевидно, находится вне int диапазона, следовательно, значение будет усечено.

Комментарии:

1. э, да. он не сильно переполнен, как я только что увидел.

Ответ №3:

Потому что 20 * 232792560 не умещается в 4 байта (целочисленное значение).

Итак, вы получили:

 20 * 232792560 = 360883904; // because of int overflow
360883904 / 20 = 18044195;