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.