5 Lexical conventions [lex]

5.13 Literals [lex.literal]

5.13.2 Integer literals [lex.icon]

integer-literal:
binary-literal integer-suffix
octal-literal integer-suffix
decimal-literal integer-suffix
hexadecimal-literal integer-suffix
binary-literal:
0b binary-digit
0B binary-digit
binary-literal ' binary-digit
octal-literal:
0
octal-literal ' octal-digit
decimal-literal:
nonzero-digit
decimal-literal ' digit
hexadecimal-literal:
hexadecimal-prefix hexadecimal-digit-sequence
binary-digit: one of
0 1
octal-digit: one of
0 1 2 3 4 5 6 7
nonzero-digit: one of
1 2 3 4 5 6 7 8 9
hexadecimal-prefix: one of
0x 0X
hexadecimal-digit-sequence:
hexadecimal-digit
hexadecimal-digit-sequence ' hexadecimal-digit
hexadecimal-digit: one of
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
integer-suffix:
unsigned-suffix long-suffix
unsigned-suffix long-long-suffix
long-suffix unsigned-suffix
long-long-suffix unsigned-suffix
unsigned-suffix: one of
u U
long-suffix: one of
l L
long-long-suffix: one of
ll LL
In an integer-literal, the sequence of binary-digits, octal-digits, digits, or hexadecimal-digits is interpreted as a base N integer as shown in table Table 7; the lexically first digit of the sequence of digits is the most significant.
[Note
:
The prefix and any optional separating single quotes are ignored when determining the value.
— end note
]
Table 7: Base of integer-literals   [tab:lex.icon.base]
Kind of integer-literal
base N
binary-literal
2
octal-literal
8
decimal-literal
10
hexadecimal-literal
16
The hexadecimal-digits a through f and A through F have decimal values ten through fifteen.
[Example
:
The number twelve can be written 12, 014, 0XC, or 0b1100.
The integer-literals 1048576, 1'048'576, 0X100000, 0x10'0000, and 0'004'000'000 all have the same value.
— end example
]
The type of an integer-literal is the first type in the list in Table 8 corresponding to its optional integer-suffix in which its value can be represented.
An integer-literal is a prvalue.
Table 8: Types of integer-literals   [tab:lex.icon.type]
integer-suffix
decimal-literal
integer-literal other than decimal-literal
none
int
int
long int
unsigned int
long long int
long int
unsigned long int
long long int
unsigned long long int
u or U
unsigned int
unsigned int
unsigned long int
unsigned long int
unsigned long long int
unsigned long long int
l or L
long int
long int
long long int
unsigned long int
long long int
unsigned long long int
Both u or U
unsigned long int
unsigned long int
and l or L
unsigned long long int
unsigned long long int
ll or LL
long long int
long long int
unsigned long long int
Both u or U
unsigned long long int
unsigned long long int
and ll or LL
If an integer-literal cannot be represented by any type in its list and an extended integer type ([basic.fundamental]) can represent its value, it may have that extended integer type.
If all of the types in the list for the integer-literal are signed, the extended integer type shall be signed.
If all of the types in the list for the integer-literal are unsigned, the extended integer type shall be unsigned.
If the list contains both signed and unsigned types, the extended integer type may be signed or unsigned.
A program is ill-formed if one of its translation units contains an integer-literal that cannot be represented by any of the allowed types.