В спецификации Scala написано
1.3.1 Целочисленные литералы
Синтаксис:
integerLiteral ::= (decimalNumeral | hexNumeral | octalNumeral) [‘L’ | ‘l’]
decimalNumeral ::= ‘0’ | nonZeroDigit {digit}
hexNumeral ::= ‘0’ ‘x’ hexDigit {hexDigit}
octalNumeral ::= ‘0’ octalDigit {octalDigit}
digit ::= ‘0’ | nonZeroDigit
nonZeroDigit ::= ‘1’ | · · · | ‘9’
octalDigit ::= ‘0’ | · · · | ‘7’
Целочисленные литералы обычно имеют тип Int или тип Long, за которым следует L
или l
суффикс. Значения типа Int представляют собой целые числа от -2 31 до 2 31 -1 включительно. Значения типа Long представляют собой целые числа от -2 63 до 2 63 -1 включительно.
Ошибка времени компиляции происходит, если целочисленный литерал обозначает число вне этих
Диапазоны
Последний раз, когда я проверял 0x80000000
, равен 2147483648, который должен быть вне диапазона для Int
( "между -2 31 и 2 31 -1, включено ").
Тем не менее компилятор не жалуется, а вместо этого позволяет целочисленному переполнению в -2147483648.
Итак, спецификация неверна, компилятор неверен или я что-то неправильно понял?
Редактировать: То же число, записанное в десятичной форме, обрабатывается правильно и выдает ошибку.