Spec-Zone.ru › C++

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

Позволяет использовать значения целочисленного типа в выражениях напрямую.

Синтаксис

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

десятичный-литерал целочисленный-суффикс (необязательно) (1)
восьмеричный-литерал целочисленный-суффикс (необязательно) (2)
шестнадцатеричный-литерал целочисленный-суффикс (необязательно) (3)
двоичный-литерал целочисленный-суффикс (необязательно) (4) (с C++14)

где

  • десятичный-литерал — это ненулевая десятичная цифра (1, 2, 3, 4, 5, 6, 7, 8, 9), за которой следуют ноль или более десятичных цифр (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
  • восьмеричный-литерал — это цифра ноль (0) , за которой следуют ноль или более восьмеричных цифр (0, 1, 2, 3, 4, 5, 6, 7)
  • шестнадцатеричный-литерал — это последовательность символов 0x или последовательность символов 0X , за которой следуют одна или более шестнадцатеричных цифр (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F)
  • двоичный-литерал — это последовательность символов 0b или последовательность символов 0B , за которой следуют одна или более двоичных цифр (0, 1)
  • целочисленный-суффикс, если он предоставлен, может содержать одну или обе следующие (если обе предоставлены, они могут быть в любом порядке:
  • беззнаковый-суффикс (символ u или символ U)
  • один из
    • длинный-суффикс (символ l или символ L)
  • длиннодлинный-суффикс (последовательность символов ll или последовательность символов LL)
(с C++11)
  • размерный-суффикс (символ z или символ Z)
(с C++23)

Необязательные одинарные кавычки (') могут быть вставлены между цифрами в качестве разделителя; они игнорируются при определении значения литерала.

(с C++14)

Целочисленный литерал (как и любой литерал) является первичным выражением.

Объяснение

1) Десятичный целочисленный литерал (основание 10).
2) Восьмеричный целочисленный литерал (основание 8).
3) Шестнадцатеричный целочисленный литерал (основание 16, буквы 'a' по 'f' представляют значения (десятичные) от 10 до 15).
4) Двоичный целочисленный литерал (основание 2).

Первая цифра целочисленного литерала — самая значащая.

Пример. Следующие переменные инициализируются одним и тем же значением:

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C++14

Пример. Следующие переменные также инициализируются одним и тем же значением:

unsigned long long l1 = 18446744073709550592ull;       // C++11
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14
unsigned long long l3 = 1844'6744'0737'0955'0592uLL;   // C++14
unsigned long long l4 = 184467'440737'0'95505'92LLU;   // C++14

Тип литерала

Тип целочисленного литерала — это первый тип, в котором значение может уместиться, из списка типов, который зависит от числовой системы и от целочисленного-суффикса:

Суффикс Десятичные системы счисления Двоичные, восьмеричные или шестнадцатеричные системы счисления
(без суффикса)
  • int
  • long int
  • long long int (с C++11)
  • int
  • unsigned int
  • long int
  • unsigned long int
  • long long int (с C++11)
  • unsigned long long int (с C++11)
u или U
  • unsigned int
  • unsigned long int
  • unsigned long long int (с C++11)
  • unsigned int
  • unsigned long int
  • unsigned long long int (с C++11)
l или L
  • long int
  • unsigned long int (до C++11)
  • long long int (с C++11)
  • long int
  • unsigned long int
  • long long int (с C++11)
  • unsigned long long int (с C++11)
оба l/L
и u/U
  • unsigned long int
  • unsigned long long int (с C++11)
  • unsigned long int
  • unsigned long long int (с C++11)
ll или LL
  • long long int (с C++11)
  • long long int (с C++11)
  • unsigned long long int (с C++11)
оба ll/LL
и u/U
  • unsigned long long int (с C++11)
  • unsigned long long int (с C++11)
z или Z
  • знаковое значение std::size_t (с C++23)
  • знаковое значение std::size_t (с C++23)
  • std::size_t (с C++23)
оба z/Z
и u/U
  • std::size_t (с C++23)
  • std::size_t (с C++23)

Если значение целочисленного литерала без размерного-суффикса(с C++23) слишком велико для любого из разрешенных типов, и компилятор поддерживает расширенный целочисленный тип (такой как __int128), который может представить это значение, то литерал может быть присвоен этому расширенному целочисленному типу; в противном случае программа некорректна.

Примечания

Регистр букв в целочисленных литералах игнорируется: 0xDeAdBeEfU и 0XdeadBEEFu представляют одно и то же число (исключение — длиннодлинный-суффикс, который равен ll или LL, а не lL или Ll )(с C++11).

Нет отрицательных целочисленных литералов. Выражения, такие как -1, применяют унарный минус-оператор к значению, представленному литералом, что может включать неявные преобразования типов.

В C до C99 (но не в C++), десятичные значения без суффикса, которые не помещаются в long int, могут иметь тип unsigned long int.

При использовании в управляющем выражении #if или #elif, все знакомые целочисленные константы ведут себя так, как будто у них тип std::intmax_t, а все беззнаковые целочисленные константы — как будто у них тип std::uintmax_t.

(с C++11)
END_OF_DOCUMENT_MARKER

Из-за максимального сцепления, шестнадцатеричные целочисленные литералы, оканчивающиеся на e и E, если за ними следуют операторы + или -, должны быть разделены от оператора пробелом или скобками в исходном коде:

auto x = 0xE+2.0;   // error
auto y = 0xa+2.0;   // OK
auto z = 0xE +2.0;  // OK
auto q = (0xE)+2.0; // OK

В противном случае образуется один неверный токен предпроцессорного числа, что приводит к сбою дальнейшего анализа.

Макросы тестирования функций Значение Стандарт Функция
__cpp_binary_literals 201304L (C++14) Двоичные литералы
__cpp_size_t_suffix 202011L (C++23) Литеральные суффиксы для std::size_t и его знакового варианта

Пример

#include <cstddef>
#include <iostream>
#include <type_traits>
 
int main()
{
    std::cout << 123 << '\n'
              << 0123 << '\n'
              << 0x123 << '\n'
              << 0b10 << '\n'
              << 12345678901234567890ull << '\n'
              << 12345678901234567890u << '\n'; // the type is unsigned long long
                                                // even without a long long suffix
 
//  std::cout << -9223372036854775808 << '\n'; // error: the value
               // 9223372036854775808 cannot fit in signed long long, which is the
               // biggest type allowed for unsuffixed decimal integer literal
    std::cout << -9223372036854775808u << '\n'; // unary minus applied to unsigned
               // value subtracts it from 2^64, this gives 9223372036854775808
    std::cout << -9223372036854775807 - 1 << '\n'; // correct way to calculate
                                                   // the value -9223372036854775808
 
#if __cpp_size_t_suffix >= 202011L // C++23
    static_assert(std::is_same_v<decltype(0UZ), std::size_t>);
    static_assert(std::is_same_v<decltype(0Z), std::make_signed_t<std::size_t>>);
#endif
}

Вывод:

123
83
291
2
12345678901234567890
12345678901234567890
9223372036854775808
-9223372036854775808

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применен к Поведение, как опубликовано Правильное поведение
CWG 2698 C++23 целочисленный литерал с суффиксом размера мог иметь расширенный целочисленный тип некорректно сформированный, если слишком большой

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2023):
    • 5.13.2 Целочисленные литералы [lex.icon]
  • Стандарт C++20 (ISO/IEC 14882:2020):
    • 5.13.2 Целочисленные литералы [lex.icon]
  • Стандарт C++17 (ISO/IEC 14882:2017):
    • 5.13.2 Целочисленные литералы [lex.icon]
  • Стандарт C++14 (ISO/IEC 14882:2014):
    • 2.14.2 Целочисленные литералы [lex.icon]
  • Стандарт C++11 (ISO/IEC 14882:2011):
    • 2.14.2 Целочисленные литералы [lex.icon]
  • Стандарт C++98 (ISO/IEC 14882:1998):
    • 2.13.1 Целочисленные литералы [lex.icon]

См. также

пользовательские литералы(C++11) литералы с пользовательскими суффиксами
C документация для целочисленной константы

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/integer_literal

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API