整型字面量
允許在表示式中直接使用整型值。
目錄 |
[編輯] 語法
整型字面量具有以下形式
十進位制字面量 整型字尾 (可選) | (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 起) |
整型字面量(與任何字面量一樣)是一個主表示式。
[編輯] 解釋
整型字面量的第一個數字是最重要的。
示例。以下變數被初始化為相同的值
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這樣的表示式是將一元減號運算子應用於字面量所表示的值,這可能涉及隱式型別轉換。
在 C99 之前的 C 語言中(但不在 C++ 中),不帶字尾的十進位制值如果不能放入long int,則允許其型別為unsigned long int。
在 #if 或 #elif 的控制表示式中使用時,所有有符號整型常量都表現得好像它們具有型別 std::intmax_t,所有無符號整型常量都表現得好像它們具有型別 std::uintmax_t。 |
(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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
CWG 2698 | C++23 | 帶大小字尾的整型字面量可能具有擴充套件整型 | 如果太大則格式錯誤 |
[編輯] 參考
- 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 文件 關於 整型常量
|