1024 * 1024 * 1024 * 1024
и 2147483648
не имеют одинаковое значение в Java.
На самом деле, 2147483648
даже не имеет значения (хотя и 2147483648L
есть) в Java. Компилятор буквально не знает, что это такое и как его использовать. Так что скулит.
1024
является действительным int в Java, и действительное значение, int
умноженное на другое действительное значение int
, всегда является допустимым int
. Даже если это не то значение, которое вы ожидаете интуитивно ожидать, потому что вычисления будут переполнены.
пример
Рассмотрим следующий пример кода:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Вы ожидаете, что это приведет к ошибке компиляции? Это становится немного более скользким теперь.
Что если мы поместим цикл с 3 итерациями и умножим на цикл?
Компилятору разрешено оптимизировать, но он не может изменить поведение программы, пока он это делает.
Некоторая информация о том, как на самом деле обрабатывается этот случай:
В Java и многих других языках целые числа будут состоять из фиксированного числа битов. Вычисления, которые не соответствуют данному количеству битов, будут переполнены ; вычисление в основном выполняется по модулю 2 ^ 32 в Java, после чего значение преобразуется обратно в подписанном целое.
Другие языки или API используют динамическое число битов ( BigInteger
в Java), вызывают исключение или устанавливают магическое значение, например not-a-number.