Jump to content

Целочисленный литерал

В информатике целочисленный литерал — это своего рода литерал для целого числа которого , значение непосредственно представлено в исходном коде . Например, в операторе присваивания 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".

Распознавание строки (последовательности символов в исходном коде) как целочисленного литерала является частью этапа лексического анализа (лексинга), а оценка литерала до его значения является частью этапа семантического анализа . В лексере и грамматике фраз класс токена часто обозначается integer, где строчная буква указывает на класс токена лексического уровня, в отличие от правила производства на уровне фразы (например, ListOfIntegers). После того как строка была лексизирована (токенизирована) как целочисленный литерал, ее значение не может быть определено синтаксически (это просто целое число), и оценка ее значения становится семантическим вопросом.

Целочисленные литералы обычно лексируются с помощью регулярных выражений , как в Python . [1]

Как и другие литералы, целочисленные литералы обычно оцениваются во время компиляции, как часть фазы семантического анализа. В некоторых случаях этот семантический анализ выполняется в лексере сразу после распознавания целочисленного литерала, тогда как в других случаях он откладывается до этапа синтаксического анализа или до тех пор, пока дерево разбора не будет полностью построено. Например, при распознавании строки 0x10 лексер может немедленно оценить это значение как 16 и сохранить его (токен типа integer и значение 16), или отложить оценку и вместо этого записать токен типа integer и ценность 0x10.

После оценки литералов дальнейший семантический анализ в форме свертывания констант возможен , что означает, что литеральные выражения, включающие литеральные значения, могут быть оценены на этапе компиляции. Например, в заявлении x = 2 + 2 после того, как литералы были вычислены и выражение 2 + 2 был проанализирован, затем его можно оценить как 4, хотя само значение 4 не отображается как литерал.

Целочисленные литералы часто имеют префиксы, обозначающие основу, и реже суффиксы, обозначающие тип. [1] Например, в С++ 0x10ULL указывает значение 16 (поскольку шестнадцатеричное) как длинное целое число без знака.

Общие префиксы включают:

Общие суффиксы включают:

  • l или L для длинного целого числа;
  • ll или LL для длинного целого числа;
  • u или U для беззнакового целого числа.

Эти аффиксы чем-то похожи на сигилы , хотя сигилы прикрепляются к идентификаторам (именам), а не к литералам.

Разделители цифр

[ редактировать ]

В некоторых языках целочисленные литералы могут содержать разделители цифр, позволяющие группировать цифры в более разборчивые формы. Если это доступно, обычно это можно сделать и для литералов с плавающей запятой. Это особенно полезно для битовых полей и позволяет сразу увидеть размер больших чисел (например, миллиона) путем суббитизации, а не подсчета цифр. Это также полезно для номеров, которые обычно группируются, например, номера кредитных карт или номера социального страхования . [а] Очень длинные числа можно дополнительно сгруппировать, удвоив разделители.

Обычно десятичные числа (по основанию 10) группируются в группы из трех цифр (представляющие одно из 1000 возможных значений), двоичные числа (по основанию 2) в группы из четырех цифр (один полубайт , представляющий одно из 16 возможных значений) и шестнадцатеричные числа ( base-16) в двух группах цифр (каждая цифра — это один полубайт, поэтому две цифры — это один байт , представляющий одно из 256 возможных значений). Числа из других систем (например, идентификационные номера) группируются в соответствии с используемым соглашением.

В Аде , [2] [3] C# (с версии 7.0), D , Eiffel , Go (с версии 1.13), [4] Haskell (начиная с версии GHC 8.6.1), [5] Java (начиная с версии 7), [6] Юлия , Perl , Python (с версии 3.6), [7] Руби , Ржавчина [8] и Свифт , [9] целочисленные литералы и литералы с плавающей запятой могут быть разделены подчеркиванием ( _). Могут быть некоторые ограничения на размещение; например, в Java они не могут появляться в начале или конце литерала, а также рядом с десятичной точкой. Хотя точка, запятая и (тонкие) пробелы используются в обычном письме для разделения цифр, они противоречат их существующему использованию в языках программирования в качестве точки счисления , разделителя списков (а в C/C++ - оператора-запятой ) и разделителя токенов. .

Примеры включают в себя:

int oneMillion = 1_000_000;
int creditCardNumber = 1234_5678_9012_3456;
int socialSecurityNumber = 123_45_6789;

В C++14 (2014 г.) и следующей версии C по состоянию на 2022 г. , C23 , символ апострофа может использоваться для произвольного разделения цифр в числовых литералах. [10] [11] Первоначально подчеркивание было предложено в 1993 году. [12] и снова для C++11 , [13] следуя другим языкам. Однако это вызвало конфликт с определяемыми пользователем литералами , поэтому вместо него был предложен апостроф в виде « верхней запятой » (которая используется в некоторых других контекстах). [14] [15]

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;

Примечания

[ редактировать ]
  1. ^ Однако обычно такие конфиденциальные числа не включаются в качестве литералов.
  1. ^ Перейти обратно: а б " 2.4.4. Целые и длинные целые литералы "
  2. ^ «Справочное руководство по языку Ada '83: 2.4. Числовые литералы» .
  3. ^ « Обоснование разработки языка программирования Ada®»: 2.1 Лексическая структура» .
  4. ^ «Примечания к выпуску Go 1.13 — Изменения в языке» . Проверено 5 ноября 2020 г.
  5. ^ «Руководство пользователя компилятора Glasgow Haskell: 11.3.7. Числовые подчеркивания» . Проверено 31 января 2019 г.
  6. ^ «Подчеркивания в числовых литералах» . Проверено 12 августа 2015 г.
  7. ^ «Что нового в Python 3.6» .
  8. ^ «Литералы и операторы» . Проверено 15 ноября 2019 г.
  9. ^ «Язык программирования Swift: лексическая структура» .
  10. ^ Кроул, Лоуренс; Смит, Ричард; Снайдер, Джефф; Вандевурде, Давид (25 сентября 2013 г.). «N3781 Одинарные кавычки как разделитель цифр» (PDF) .
  11. ^ Аарон Боллман (15 декабря 2020 г.). «N2626: Разделители цифр» (PDF) .
  12. ^ Джон Макс Скаллер (26 марта 1993 г.). «N0259: Предложение разрешить двоичные литералы и некоторые другие небольшие изменения в главе 2: Лексические соглашения» (PDF) .
  13. ^ Кроул, Лоуренс (2 мая 2007 г.). «N2281: Разделители цифр» .
  14. ^ Вандевурде, Дэвид (21 сентября 2012 г.). «N3448: Безболезненное разделение цифр» (PDF) .
  15. ^ Кроул, Лоуренс (19 декабря 2012 г.). «N3499: Разделители цифр» .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 4fc33e2ef763bb57c36e91a7c44b3078__1719736140
URL1:https://arc.ask3.ru/arc/aa/4f/78/4fc33e2ef763bb57c36e91a7c44b3078.html
Заголовок, (Title) документа по адресу, URL1:
Integer literal - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)