Namespaces
Variants

Integer literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

Содержание

Синтаксис

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

decimal-literal integer-suffix  (необязательно) (1)
octal-literal integer-suffix  (необязательно) (2)
hex-literal integer-suffix  (необязательно) (3)
binary-literal integer-suffix  (необязательно) (4) (начиная с C++14)

где

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

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

(since 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

Тип литерала

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

Суффикс Десятичные системы счисления Двоичные, восьмеричные или шестнадцатеричные системы счисления
(без суффикса)
  • 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)
оба z / Z
и u / U

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

Примечания

Буквы в целочисленных литералах нечувствительны к регистру: 0xDeAdBeEfU и 0XdeadBEEFu представляют одно и то же число (одно исключение — суффикс long-long , который может быть либо 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)

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

auto x = 0xE+2.0;   // ошибка
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'; // тип unsigned long long
                                                // даже без суффикса long long
//  std::cout << -9223372036854775808 << '\n'; // ошибка: значение
               // 9223372036854775808 не помещается в signed long long, который является
               // наибольшим типом для десятичных целочисленных литералов без суффикса
    std::cout << -9223372036854775808u << '\n'; // унарный минус применён к беззнаковому
               // значению вычитает его из 2^64, получается 9223372036854775808
    std::cout << -9223372036854775807 - 1 << '\n'; // правильный способ вычисления
                                                   // значения -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 Applied to Behavior as published Correct behavior
CWG 2698 C++23 целочисленный литерал с size-suffix мог иметь расширенный целочисленный тип некорректный, если слишком большой

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 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 для целочисленных констант