Вычисление диапазона примитивов Java [дубликат]
этот вопрос уже есть ответ здесь:
в Java, когда мы заявляем
short number=1024*1024*1024;
это даст ошибку времени компиляции, но
short number=1024 * 1024 * 1024 * 1024;
компилирует нормально. Почему это происходит?
2 ответа:
компилятор в этом случае вычислит вычисление (поскольку оно содержит только константы) и попытается присвоить результат переменной. Этот расчет выполняется с типом
int
, а конвертированный только вshort
по назначению, если это вообще возможно.в вашем случае первый расчет слишком велик, чтобы вписаться в
short
(1073741824
). Второй будет переполнятьint
и в конечном итоге в диапазоне,short
поддерживает (0
). Так что задание работает в этом случай.имейте в виду, вы, вероятно, никогда не хотите полагаться на эти вещи в коде.
вы столкнулись с проблемой, ваш номер -обертывание вокруг. в первом случае он не обертывается и, следовательно, он переполняет диапазон коротких. Но во втором случае он обертывается после calculationa и, следовательно, он находится в диапазоне коротких, и поэтому у вас нет ошибки времени компиляции.
потеря точности означает, что вы теряете информацию из заданного значения.(краткий формат данных 16-битное целое число. Он имеет минимальное значение -32 768 и максимальное значение 32 767 (включительно).) в вашем первом случае диапазон коротких пересекается(1073741824) и, следовательно, вы теряете информацию.
сужающее преобразование целого числа со знаком в целочисленный тип T просто отбрасывает все, кроме N младших битов, где n-число битов, используемых для представления т. типа
EDIT: -
с JLS §3.10.1(очень правильно упомянули в этой аналогичный вопрос)
Это-ошибка времени компиляции, если десятичный литерал типа int больше чем 2147483648 (231), или если появляется десятичный литерал 2147483648 где угодно, кроме как в качестве операнда унарного оператора минус (§15.15.4).