Целочисленный литерал
Позволяет использовать значения целочисленного типа в выражениях напрямую.
Синтаксис
Целочисленный литерал имеет вид
| десятичный-литерал целочисленный-суффикс (необязательно) | (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)
| (с C++11) |
| (с C++23) |
| Необязательные одинарные кавычки (') могут быть вставлены между цифрами в качестве разделителя; они игнорируются при определении значения литерала. | (с C++14) |
Целочисленный литерал (как и любой литерал) является первичным выражением.
Объяснение
'a' по 'f' представляют значения (десятичные) от 10 до 15).Первая цифра целочисленного литерала — самая значащая.
Пример. Следующие переменные инициализируются одним и тем же значением:
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
Тип литерала
Тип целочисленного литерала — это первый тип, в котором значение может уместиться, из списка типов, который зависит от числовой системы и от целочисленного-суффикса:
| Суффикс | Десятичные системы счисления | Двоичные, восьмеричные или шестнадцатеричные системы счисления |
|---|---|---|
| (без суффикса) |
|
|
u или U |
|
|
l или L |
|
|
оба l/Lи u/U |
|
|
ll или LL |
|
|
оба ll/LLи u/U |
|
|
z или Z |
|
|
оба z/Zи u/U |
|
|
Если значение целочисленного литерала без размерного-суффикса(с C++23) слишком велико для любого из разрешенных типов, и компилятор поддерживает расширенный целочисленный тип (такой как __int128), который может представить это значение, то литерал может быть присвоен этому расширенному целочисленному типу; в противном случае программа некорректна.
Примечания
Регистр букв в целочисленных литералах игнорируется: 0xDeAdBeEfU и 0XdeadBEEFu представляют одно и то же число (исключение — длиннодлинный-суффикс, который равен ll или LL, а не lL или Ll )(с C++11).
Нет отрицательных целочисленных литералов. Выражения, такие как -1, применяют унарный минус-оператор к значению, представленному литералом, что может включать неявные преобразования типов.
В C до C99 (но не в C++), десятичные значения без суффикса, которые не помещаются в long int, могут иметь тип unsigned long int.
| При использовании в управляющем выражении #if или #elif, все знакомые целочисленные константы ведут себя так, как будто у них тип | (с C++11) |
Из-за максимального сцепления, шестнадцатеричные целочисленные литералы, оканчивающиеся на 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