# 5 Lexical conventions [lex]

## 5.13 Literals [lex.literal]

### 5.13.2 Integer literals [lex.icon]

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
0x 0X
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
unsigned-suffix: one of
u U
long-suffix: one of
l L
long-long-suffix: one of
ll LL
size-suffix: one of
z Z
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 1:
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 1:
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.
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 🔗 z or Z the signed integer type corresponding the signed integer type 🔗 to std​::​size_t ([support.types.layout]) corresponding to std​::​size_t 🔗 std​::​size_t 🔗 Both u or U std​::​size_t std​::​size_t 🔗 and z or Z
Except for integer-literals containing a size-suffix, if the value of 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 is signed.
If all of the types in the list for the integer-literal are unsigned, the extended integer type is unsigned.
If the list contains both signed and unsigned types, the extended integer type may be signed or unsigned.
If an integer-literal cannot be represented by any of the allowed types, the program is ill-formed.
[Note 2:
An integer-literal with a z or Z suffix is ill-formed if it cannot be represented by std​::​size_t.
— end note]