В Java, когда мы объявляем
short number=1024*1024*1024;
это даст ошибку времени компиляции, но
short number=1024 * 1024 * 1024 * 1024;
компилируется нормально. Почему это происходит?
В Java, когда мы объявляем
short number=1024*1024*1024;
это даст ошибку времени компиляции, но
short number=1024 * 1024 * 1024 * 1024;
компилируется нормально. Почему это происходит?
В этом случае компилятор оценит вычисление (поскольку оно содержит только константы) и попытается присвоить результат переменной. Этот расчет выполняется с типом int
и преобразуется в short
только при назначении, если это вообще возможно.
В вашем случае первый расчет слишком велик, чтобы вписаться в short
(1073741824
). Второй переполнит int
и попадет в диапазон, поддерживаемый short
(0
). Таким образом, назначение работает в этом случае.
Имейте в виду, вы, вероятно, никогда не захотите полагаться на эти вещи в коде.
1024L
, и в этом случае расчет выполняется как long
, и переполнения не происходит, что снова вызывает ошибку компиляции.
- person Chris Hayes; 16.07.2014
Вы столкнулись с проблемой, так как ваш номер обтекание. В первом случае он не обтекается и, следовательно, выходит за пределы диапазона short. Но во втором случае он переносится после вычисления и, следовательно, он находится в диапазоне коротких, поэтому у вас нет ошибки времени компиляции.
Потеря точности означает, что вы теряете информацию о заданном значении.(Короткий тип данных — это 16-разрядное целое число в дополнении до двух со знаком. Его минимальное значение равно -32 768, а максимальное — 32 767 (включительно). .) В вашем первом случае пересекается диапазон коротких позиций (1073741824), и, следовательно, вы теряете информацию.
Сужающее преобразование целого числа со знаком в целочисленный тип T просто отбрасывает все, кроме n младших битов, где n — количество битов, используемых для представления типа T.
ИЗМЕНИТЬ:-
Из JLS § 3.10.1(очень правильно упомянуто в этот аналогичный вопрос)
Это ошибка времени компиляции, если десятичный литерал типа int больше 2147483648 (231) или если десятичный литерал 2147483648 появляется где-либо, кроме операнда унарного минус-оператора (§15.15.4).