Похоже, что когда вы вводите число в Java, компилятор автоматически считывает его как целое число, поэтому, когда вы вводите (long) 6000000000
(не в целочисленном диапазоне), он будет жаловаться, что 6000000000
это не целое число. Чтобы исправить это, мне пришлось уточнить 6000000000L
. Я только что узнал об этой спецификации.
Существуют ли другие спецификации чисел, такие как short, byte, float, double? Похоже, их было бы хорошо иметь, потому что (я полагаю), если бы вы могли указать номер, который вы вводите, короткий, тогда java не пришлось бы его приводить - это предположение, поправьте меня, если я ошибаюсь . Обычно я сам ищу этот вопрос, но я не знаю, как вообще называется такая спецификация числа.
1
сl
и0
сO
(и так далее), ваш приоритет должен установить правильный шрифт (если вы можете ), затем позаботьтесь о том, чтобы не пропустить клавишу Shift.long _lo = 30;
а не30L
означает ли это, что моя переменная будет преобразована в число с плавающей запятой ? Или в случае_lo = _lo + 2.77
этого_lo
будет брошен в плавание, хотя это было объявлено длинным30
это объект,int
который автоматически конвертируется с помощью расширяющего преобразования вlong
. Во втором случае ваше утверждение незаконно. Вам нужно будет явно сделать длинную правую часть, например_lo = (long) (_lo + 2.77)
l
и1
(0
иO
соответственно) они довольно похожи.Я надеюсь, вы не будете возражать против небольшого касания, но подумайте, что вам может быть интересно узнать, что помимо
F
(для float),D
(для double) иL
(для длительного) было сделано предложение добавить суффиксы дляbyte
иshort
-Y
иS
соответственно . Это устранит необходимость преобразования в байты при использовании буквального синтаксиса для байтовых (или коротких) массивов. Цитируя пример из предложения:Джо Дарси наблюдает за Project Coin для Java 7, и его блог был простым способом отслеживать эти предложения.
источник
0b
префикс для двоичных литералов. Ой.По умолчанию любой интегральный примитивный тип данных (byte, short, int, long) будет рассматриваться компилятором java как тип int . Для byte и short , пока присвоенное им значение находится в их диапазоне, проблем нет и суффикс не требуется. Если значение, присвоенное byte и short, превышает их диапазон, требуется явное приведение типа.
Пример:
чтобы преодолеть это, выполните приведение типов.
В случае длинного типа данных он может принимать целочисленное значение без каких-либо проблем. Предположим, мы назначаем как
в этом случае суффикс типа L / l не требуется. По умолчанию значение 2147483647 считается компилятором java как тип int. Приведение внутреннего типа выполняется компилятором, а int автоматически повышается до типа Long.
Здесь нам нужно указать суффикс L, чтобы компилятор java рассматривал литерал 2147483648 как длинный тип.
так что наконец
источник
Это литералы, которые описаны в разделе 3.10 спецификации языка Java.
источник
Поскольку синтаксический анализ литералов происходит во время компиляции, это абсолютно не имеет отношения к производительности. Единственная причина , имея
short
иbyte
суффиксы бы приятно, что это приведет к более компактному коду.источник
Чтобы понять , почему это необходимо различать
int
иlong
литералы, рассмотреть следующие вопросы:против
Теперь, как и следовало ожидать, оба фрагмента кода присваивают переменной одинаковое значение
l
. Не умея различатьint
иlong
буквальные, каково толкование-1 >>> 1
?или
Поэтому, даже если число находится в обычном диапазоне, нам нужно указать тип. Если бы значение по умолчанию изменилось с величиной литерала, то было бы странное изменение в интерпретации выражений просто из-за изменения цифр.
Этого не происходит
byte
,short
иchar
потому что они всегда продвигаются перед выполнением арифметических и побитовых операций. Возможно, они должны быть суффиксами целочисленного типа для использования, скажем, в выражениях инициализации массива, но это не так.float
использует суффиксf
иdouble
d
. Остальные литералы имеют однозначные типы, в том числе специальный тип дляnull
.источник
Integer.MAX_VALUE
, если бы не было возможности отличить литералы отint
и,long
это было бы неоднозначно. / Я не помню этот вопрос, но все равно пояснил свой ответ.