long a2 = 100L * 1024 * 1024 * 1024;
В этой операции, однако, по крайней мере один операнд long
. Анкет Следовательно, операция выполняется с использованием 64-битной точности, и результат численного оператора имеет тип long
. Анкет Другой не длинный операнд расширяется до типа long
по числовое продвижение и получается, что значение хранится к переменной a2
.
long a1 = 100 * 1024 * 1024 * 1024;
Постоянная экспрессия простого целого числа, результат выражения был рассчитан как тип int
. Анкет Вычисленное значение, однако, слишком большое, чтобы вписаться в целое число и, следовательно, переполнено, что привело к 0
и хранится a1
переменная.
РЕДАКТИРОВАТЬ: Как задается в следующем комментарии:
Почему это не отрицательно?
Потому что, пока в целочисленное вычисление Второе вычисление эквивалентно 25 * 2^32
куда ^
имеет значение мощности и 2^32
целочисленное значение есть 0
. Анкет Однако, чтобы объяснить, почему это ценность 0
: В бинарном:
100 * 1024 * 1024 * 1024 == 25 * 2^32;
Integer.MAX_VALUE = 2 ^ 31 -1 = 0 11111111 11111111 11111111 1111111
Integer.MAX_VALUE + 1 = 2 ^ 31 = 1 00000000 00000000 00000000 0000000
2 ^ 31
это негативное целое число (-2147483648
) как бит знака 1
И, следовательно 2 ^ 32
это просто умножение 2
к 2 ^ 31
: Левая смена, и бит знака станет 0
и, следовательно, результат 0
.
Проверьте java language specification: 4.2.2: Integer operation
Для деталей.