На компьютере наука, целочисленный литерал представляет собой разновидность литерала для целого числа, значение которого напрямую представлено в исходном коде код. Например, в операторе присваивания x = 1
строка 1
представляет собой целочисленный литерал, указывающий значение 1, а в операторе x = 0x10
строка 0x10
- это целочисленный литерал, указывающий значение 16, которое представлено 10
в шестнадцатеричной системе (обозначено префиксом 0x
).
Напротив, в x = cos (0)
выражение cos (0)
оценивается как 1 (как косинус из 0), но значение 1 буквально не включено в исходный код. Проще говоря, в x = 2 + 2,
выражение 2 + 2
оценивается как 4, но значение 4 буквально не включено. Кроме того, в x = "1"
"1"
является строковым литералом , а не целочисленным литералом, потому что он заключен в кавычки. Значение строки 1
, которое является целочисленной строкой, но это семантический анализ строкового литерала - на синтаксическом уровне «1»
- это просто строка, ничем не отличается от "foo"
.
Распознавание строки (последовательности символов в исходном коде) как целочисленного литерала является частью фазы лексического анализа (лексирования), в то время как оценка литерала по его значению выполняется часть этапа семантического анализа. В лексическом анализаторе и грамматике фраз класс лексемы часто обозначается целым числом
, где строчные буквы указывают на класс лексики лексического уровня, в отличие от производственного правила на уровне фразы (например, ListOfIntegers
). После того, как строка была преобразована (размечена) как целочисленный литерал, ее значение не может быть определено синтаксически (это просто целое число), и оценка ее значения становится семантическим вопросом.
Целочисленные литералы обычно лексируются с помощью регулярных выражений, как в Python.
Как и другие литералы, целочисленные литералы обычно оцениваются во время компиляции, как часть этапа семантического анализа. В некоторых случаях этот семантический анализ выполняется в лексере сразу после распознавания целочисленного литерала, в то время как в других случаях он откладывается до этапа синтаксического анализа или до тех пор, пока дерево синтаксического анализа не будет полностью построено. Например, при распознавании строки 0x10
лексер может немедленно оценить это как 16 и сохранить это (токен типа integer
и значение 16) или отложить оценку и вместо этого записать токен типа целое число
и значение 0x10
.
После того, как литералы были оценены, возможен дальнейший семантический анализ в форме сворачивания констант, что означает, что литеральные выражения, включающие литеральные значения, могут оцениваться на этапе компиляции. Например, в операторе x = 2 + 2
после того, как литералы были оценены и выражение 2 + 2
было проанализировано, оно может быть затем оценено как 4, хотя значение 4 сам по себе не является буквальным.
Целочисленные литералы часто имеют префиксы, указывающие основание, и реже суффиксы, указывающие тип. Например, в C++ 0x10ULL
указывает значение 16 (потому что шестнадцатеричное) как длинное длинное целое число без знака.
Общие префиксы включают:
0x
или 0X
для шестнадцатеричного (основание 16);0
, 0o
или 0O
для восьмеричного (с основанием 8);0b
или 0B
для двоичного (с основанием 2).Общие суффиксы включают:
l
или L
для длинного целого;ll
или LL
для длинного длинного целого;u
или U
для беззнакового целого.Эти аффиксы чем-то похожи на сигилы, хотя сигилы прикрепляются к идентификаторам (именам), а не к литералам.
В некоторых языках целочисленные литералы могут содержать разделители цифр, позволяющие группировать цифры в более удобочитаемые формы. Если это доступно, то обычно это можно сделать и для литералов с плавающей запятой. Это особенно полезно для битовых полей и упрощает определение размера больших чисел (например, миллиона) с первого взгляда за счет субитизации, а не подсчета цифр. Это также полезно для номеров, которые обычно сгруппированы, например, или номера социального страхования. Очень длинные числа можно сгруппировать, удвоив разделители.
Обычно десятичные числа (основание-10) группируются в группы из трех цифр (представляющие одно из 1000 возможных значений), двоичные числа (основание-2) - в четырехзначные группы (один полубайт, представляет одно из 16 возможных значений) и шестнадцатеричные числа (base-16) в двухзначных группах (каждая цифра - это один полубайт, поэтому две цифры составляют один байт , представляющий одно из 256 возможных значений). Номера из других систем (например, идентификационные номера) группируются в соответствии с используемым соглашением.
В Ada,C# (из версии 7.0), D, Eiffel, Haskell (из GHC версии 8.6.1), Java (с версии 7), Julia, Perl, Python (с версии 3.6), Ruby, Rust и Swift, целочисленные литералы и литералы с плавающей запятой могут быть разделены подчеркиванием (_
). Могут быть некоторые ограничения по размещению; например, в Java они не могут появляться ни в начале, ни в конце литерала, ни рядом с десятичной точкой. Обратите внимание, что хотя точка, запятая и (тонкие) пробелы используются в обычном письме для разделения цифр, они противоречат их существующему использованию в языках программирования как точка счисления, разделитель списка (и в C / C ++, оператор запятой ) и разделитель токенов.
Примеры включают:
int oneMillion = 1_000_000; int creditCardNumber = 1234_5678_9012_3456; int socialSecurityNumber = 123_45_6789;
В C ++ 14 (2014) символ апострофа может использоваться для произвольного разделения цифр в числовых литералах. Подчеркивание было первоначально предложено с первоначальным предложением в 1993 году, а затем снова для C ++ 11, после других языков. Однако это вызвало конфликт с определяемыми пользователем литералами, поэтому вместо него был предложен апостроф в виде «верхней запятой » (которая используется в некоторых других контекстах).
auto integer_literal = 1'000'000; auto binary_literal = 0b0100'1100'0110; auto very_long_binary_literal = 0b0000'0001'0010'0011''0100'0101'0110'0111;