Расчет диапазона примитивов Java

В Java, когда мы объявляем

short number=1024*1024*1024; 

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

short number=1024 * 1024 * 1024 * 1024;

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


person Jekin Kalariya    schedule 16.07.2014    source источник
comment
@Raedwald, Erwin, Ivan, Carlos Мой вопрос отличается от вопроса, который вы упомянули. Здесь вопрос касается не только буквальной оценки числа и времени выполнения, но и относится к диапазону коротких, в приведенном выше вопросе, хотя ни одно из выражений не является буквально, сначала выдает ошибку, вопрос в том, почему такое поведение происходит при компиляции? в любом случае спасибо, теперь я удовлетворен приведенными ниже ответами.   -  person Jekin Kalariya    schedule 23.07.2014
comment
хороший вопрос +1 с моей стороны   -  person Bhargav Modi    schedule 28.02.2015


Ответы (2)


В этом случае компилятор оценит вычисление (поскольку оно содержит только константы) и попытается присвоить результат переменной. Этот расчет выполняется с типом int и преобразуется в short только при назначении, если это вообще возможно.

В вашем случае первый расчет слишком велик, чтобы вписаться в short (1073741824). Второй переполнит int и попадет в диапазон, поддерживаемый short (0). Таким образом, назначение работает в этом случае.

Имейте в виду, вы, вероятно, никогда не захотите полагаться на эти вещи в коде.

person Joey    schedule 16.07.2014
comment
Мы также можем увидеть это, изменив один из них на 1024L, и в этом случае расчет выполняется как long, и переполнения не происходит, что снова вызывает ошибку компиляции. - person Chris Hayes; 16.07.2014
comment
@user2169777:- Потеря точности означает, что вы теряете информацию о заданном значении. (Короткий тип данных представляет собой 16-разрядное целое число в дополнении до двух со знаком. Минимальное значение -32 768, а максимальное значение - 32 767 (включительно).) В первом случае диапазон коротких позиций пересекается (1073741824), и, следовательно, вы теряете информацию. Итак, вы получаете ошибку. - person Rahul Tripathi; 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).

person Rahul Tripathi    schedule 16.07.2014