Вычисление диапазона примитивов Java [дубликат]


этот вопрос уже есть ответ здесь:

в Java, когда мы заявляем

short number=1024*1024*1024; 

это даст ошибку времени компиляции, но

short number=1024 * 1024 * 1024 * 1024;

компилирует нормально. Почему это происходит?

2 62

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).