Почему JLS утверждает, что самый большой литерал int равен 2147483648?

JLS 3.10.1. Integer Literals http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1 указывает

The largest decimal literal of type int is 2147483648.

В то же время эта линия

int x = 2147483648;

выдает ошибку компиляции

The literal 2147483648 of type int is out of range

JLS ошибается?


person Evgeniy Dorofeev    schedule 04.05.2013    source источник
comment
Наибольший десятичный литерал типа int равен 2147483648 (231). Все десятичные литералы от 0 до 2147483647 могут появляться везде, где может появляться литерал int. Это ошибка времени компиляции, если десятичный литерал типа int больше 2147483648 (231) или если десятичный литерал 2147483648 появляется где-либо, кроме операнда унарного оператора минус (§15.15.4).   -  person tckmn    schedule 04.05.2013
comment
Я согласен, хотя, что это сбивает с толку. Формулировка могла бы быть намного лучше.   -  person Bohemian♦    schedule 04.05.2013


Ответы (3)


Наибольший десятичный литерал типа int равен 2147483648 (231).

All decimal literals from 0 to 2147483647 may appear anywhere an int literal may appear. 

Это ошибка времени компиляции, если десятичный литерал типа int больше 2147483648 (231) или если десятичный литерал 2147483648 появляется где-либо, кроме операнда унарного минус-оператора (§15.15.4).

person Alpesh Gediya    schedule 04.05.2013

ИМХО плохо сформулировано. Что он пытается сказать нам этим выражением:

-2147483648

Знак минус не является частью целочисленного литерала, скорее знак минус является оператором унарного минуса, а 2147483648 является литералом int, а целочисленный литерал 2147483648 может появляться только в этом точное выражение.

person Bohemian♦    schedule 04.05.2013

JLS ошибается?

Нет, JLS специфичен - различайте переменную int и «литерал int», то есть десятичный литерал типа int.

Диапазон переменной int составляет -2 147 483 648..2 147 483 647 (т. е. -(2^31)..2^31-1).

Наибольший десятичный литерал, который компилятор будет анализировать в коде Java и использовать в контексте int, равен 2 147 483 648, но его можно использовать только как операнд унарного оператора '-', то есть вы может использовать его только одним способом - для создания самого отрицательного десятичного значения, которое может содержать int: -22147483648.

В упомянутом вами разделе JLS раздел 3.10.1 Целочисленные литералы, где сказано:

Наибольший десятичный литерал типа int равен 2147483648 (2^31).

is также говорит несколькими строками позже:

Это ошибка времени компиляции, если десятичный литерал типа int больше 2147483648 (2 ^ 31) или если десятичный литерал 2147483648 появляется где-либо, кроме операнда унарного оператора минус.

person Bert F    schedule 04.05.2013