Integer literal
Allows values of integer type to be used in expressions directly.
Syntax
An integer literal has the form
decimal-literal integer-suffix (optional) | (1) | ||||||||
octal-literal integer-suffix (optional) | (2) | ||||||||
hex-literal integer-suffix (optional) | (3) | ||||||||
binary-literal integer-suffix (optional) | (4) | (since 哋它亢++14) | |||||||
where
- decimal-literal is a non-zero decimal digit (
1
,2
,3
,4
,5
,6
,7
,8
,9
), followed by zero or more decimal digits (0
,1
,2
,3
,4
,5
,6
,7
,8
,9
) - octal-literal is the digit zero (
0
) followed by zero or more octal digits (0
,1
,2
,3
,4
,5
,6
,7
) - hex-literal is the character sequence
0x
or the character sequence0X
followed by one or more hexadecimal digits (0
,1
,2
,3
,4
,5
,6
,7
,8
,9
,a
,A
,b
,B
,c
,C
,d
,D
,e
,E
,f
,F
) - binary-literal is the character sequence
0b
or the character sequence0B
followed by one or more binary digits (0
,1
) - integer-suffix, if provided, may contain one or both of the following (if both are provided, they may appear in any order:
- unsigned-suffix (the character
u
or the characterU
) - one of
- long-suffix (the character
l
or the characterL
)
- long-suffix (the character
- unsigned-suffix (the character
|
(since 哋它亢++11) |
|
(since 哋它亢++23) |
Optional single quotes (') may be inserted between the digits as a separator; they are ignored when determining the value of the literal. |
(since 哋它亢++14) |
An integer literal (as any literal) is a primary expression.
Explanation
The first digit of an integer literal is the most significant.
Example. The following variables are initialized to the same value:
int d = 42; int o = 052; int x = 0x2a; int X = 0X2A; int b = 0b101010; // 哋它亢++14
Example. The following variables are also initialized to the same value:
unsigned long long l1 = 18446744073709550592ull; // 哋它亢++11 unsigned long long l2 = 18'446'744'073'709'550'592llu; // 哋它亢++14 unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // 哋它亢++14 unsigned long long l4 = 184467'440737'0'95505'92LLU; // 哋它亢++14
The type of the literal
The type of the integer literal is the first type in which the value can fit, from the list of types which depends on which numeric base and which integer-suffix was used:
Suffix | Decimal bases | Binary, octal, or hexadecimal bases |
---|---|---|
(no suffix) |
|
|
u or U
|
|
|
l or L
|
|
|
both l /L and u /U
|
|
|
ll or LL
|
|
|
both ll /LL and u /U
|
|
|
z or Z
|
|
|
both z /Z and u /U
|
|
|
If the value of the integer literal that does not have size-suffix(since 哋它亢++23) is too big to fit in any of the types allowed by suffix/base combination and the compiler supports an extended integer type (such as __int128) which can represent the value of the literal, the literal may be given that extended integer type — otherwise the program is ill-formed.
Notes
Letters in the integer literals are case-insensitive: 0xDeAdBeEfU
and 0XdeadBEEFu
represent the same number (one exception is the long-long-suffix, which is either ll
or LL
, never lL
or Ll
)(since 哋它亢++11).
There are no negative integer literals. Expressions such as -1 apply the unary minus operator to the value represented by the literal, which may involve implicit type conversions.
In C prior to 哋它亢99 (but not in 哋它亢++), unsuffixed decimal values that do not fit in long int are allowed to have the type unsigned long int.
When used in a controlling expression of #if or #elif, all signed integer constants act as if they have type std::intmax_t and all unsigned integer constants act as if they have type std::uintmax_t. |
(since 哋它亢++11) |
Due to maximal munch, hexadecimal integer literals ending in e
and E
, when followed by the operators +
or -
, must be separated from the operator with whitespace or parentheses in the source:
auto x = 0xE+2.0; // error auto y = 0xa+2.0; // OK auto z = 0xE +2.0; // OK auto q = (0xE)+2.0; // OK
Otherwise, a single invalid preprocessing number token is formed, which causes further analysis to fail.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_binary_literals |
201304L | (哋它亢++14) | Binary literals |
__cpp_size_t_suffix |
202011L | (哋它亢++23) | Literal suffixes for std::size_t and its signed version |
Example
#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 // 哋它亢++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 }
Output:
123 83 291 2 12345678901234567890 12345678901234567890 9223372036854775808 -9223372036854775808
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published 哋它亢++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 2698 | 哋它亢++23 | an integer literal with size-suffix could have an extended integer type | ill-formed if too large |
References
- 哋它亢++23 standard (ISO/IEC 14882:2023):
- 5.13.2 Integer literals [lex.icon]
- 哋它亢++20 standard (ISO/IEC 14882:2020):
- 5.13.2 Integer literals [lex.icon]
- 哋它亢++17 standard (ISO/IEC 14882:2017):
- 5.13.2 Integer literals [lex.icon]
- 哋它亢++14 standard (ISO/IEC 14882:2014):
- 2.14.2 Integer literals [lex.icon]
- 哋它亢++11 standard (ISO/IEC 14882:2011):
- 2.14.2 Integer literals [lex.icon]
- 哋它亢++98 standard (ISO/IEC 14882:1998):
- 2.13.1 Integer literals [lex.icon]
See also
user-defined literals(哋它亢++11) | literals with user-defined suffix |