名稱空間
變體
操作

整型字面量

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
 
 

允許在表示式中直接使用整型值。

目錄

[編輯] 語法

整型字面量具有以下形式

十進位制字面量 整型字尾 (可選) (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
  • 長長整型字尾(字元序列 ll 或字元序列 LL
(C++11 起)
  • 大小字尾(字元 z 或字元 Z
(C++23 起)

可選的單引號 (') 可以插入在數字之間作為分隔符;在確定字面量的值時它們會被忽略。

(C++14 起)

整型字面量(與任何字面量一樣)是一個主表示式

[編輯] 解釋

1) 十進位制整型字面量(基數 10)。
2) 八進位制整型字面量(基數 8)。
3) 十六進位制整型字面量(基數 16,字母 'a''f' 代表值(十進位制)10 到 15)。
4) 二進位制整型字面量(基數 2)。

整型字面量的第一個數字是最重要的。

示例。以下變數被初始化為相同的值

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

[編輯] 字面量的型別

整型字面量的型別是其值能夠容納的第一個型別,該型別列表取決於使用的數字基數和整型字尾

字尾 十進位制基數 二進位制、八進位制或十六進位制基數
(無後綴)
  • int
  • long int
  • long long int (C++11 起)
  • int
  • unsigned int
  • long int
  • unsigned long int
  • long long int (C++11 起)
  • unsigned long long int (C++11 起)
uU
  • unsigned int
  • unsigned long int
  • unsigned long long int (C++11 起)
  • unsigned int
  • unsigned long int
  • unsigned long long int (C++11 起)
lL
  • long int
  • unsigned long int (C++11 之前)
  • long long int (C++11 起)
  • long int
  • unsigned long int
  • long long int (C++11 起)
  • unsigned long long int (C++11 起)
l/L
u/U
  • unsigned long int
  • unsigned long long int (C++11 起)
  • unsigned long int
  • unsigned long long int (C++11 起)
llLL
  • long long int (C++11 起)
  • long long int (C++11 起)
  • unsigned long long int (C++11 起)
ll/LL
u/U
  • unsigned long long int (C++11 起)
  • unsigned long long int (C++11 起)
zZ
z/Z
u/U

如果整型字面量的值不帶大小字尾(C++23 起)太大而無法放入由字尾/基數組合允許的任何型別中,並且編譯器支援可以表示該字面量值的擴充套件整型(例如__int128),則該字面量可以被賦予該擴充套件整型——否則程式格式錯誤。

[編輯] 注意

整型字面量中的字母不區分大小寫:0xDeAdBeEfU0XdeadBEEFu 代表相同的數字(一個例外是長長整型字尾,它必須是 llLL,絕不能是 lLLl(C++11 起)

不存在負整型字面量。像-1這樣的表示式是將一元減號運算子應用於字面量所表示的值,這可能涉及隱式型別轉換。

在 C99 之前的 C 語言中(但不在 C++ 中),不帶字尾的十進位制值如果不能放入long int,則允許其型別為unsigned long int

#if#elif 的控制表示式中使用時,所有有符號整型常量都表現得好像它們具有型別 std::intmax_t,所有無符號整型常量都表現得好像它們具有型別 std::uintmax_t

(C++11 起)

由於最大吞噬規則,以 eE 結尾的十六進位制整型字面量,當後面跟著運算子 +- 時,必須在原始碼中用空格或括號將其與運算子分開

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 文件 關於 整型常量