Namespaces
Variants

Integer literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

允许整型类型的值直接在表达式中使用。

目录

语法

整数字面量的形式为

decimal-literal integer-suffix  (可选) (1)
octal-literal integer-suffix  (可选) (2)
hex-literal integer-suffix  (可选) (3)
binary-literal integer-suffix  (可选) (4) (自 C++14 起)

其中

  • decimal-literal 是一个非零十进制数字( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ),后跟零个或多个十进制数字( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
  • octal-literal 是数字零( 0 )后跟零个或多个八进制数字( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7
  • hex-literal 是字符序列 0x 或字符序列 0X 后跟一个或多个十六进制数字( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , a , A , b , B , c , C , d , D , e , E , f , F
  • binary-literal 是字符序列 0b 或字符序列 0B 后跟一个或多个二进制数字( 0 , 1
  • integer-suffix ,如果提供,可以包含以下一项或两项(如果同时提供,可以按任意顺序出现):
  • 无符号后缀 (字符 u 或字符 U
  • 以下之一
  • 长整型后缀 (字符 l 或字符 L
  • long-long-后缀 (字符序列 ll 或字符序列 LL
(C++11 起)
  • size-suffix (字符 z 或字符 Z
(since C++23)

可在数字之间插入可选的单引号( ' )作为分隔符;在确定字面值时会忽略这些分隔符。

(since 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
注:代码段中的数值表示方式(十进制42、八进制052、十六进制0x2a/0X2A、二进制0b101010)及C++术语均按规则保留未翻译。

示例。以下变量也被初始化为相同的值:

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 起)
u U
  • unsigned int
  • unsigned long int
  • unsigned long long int (自 C++11 起)
  • unsigned int
  • unsigned long int
  • unsigned long long int (自 C++11 起)
l L
  • 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 起)
ll LL
  • 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 起)
z Z
同时使用 z / Z
u / U

如果整数字面值 无大小后缀 的情况 (C++23 起) 的数值过大,无法通过后缀/基数组合所允许的任何类型存储,且编译器支持可以表示该字面值数值的扩展整数类型(例如 __int128 ),则该字面值可能被赋予该扩展整数类型——否则程序非良构。

注释

整数字面值中的字母不区分大小写: 0xDeAdBeEfU 0XdeadBEEFu 表示相同的数值 (一个例外是 long-long-后缀 ,只能是 ll LL ,不能是 lL Ll (C++11 起)

不存在负整数字面值。诸如 - 1 的表达式会对字面值所表示的值应用 一元减号运算符 ,该过程可能涉及隐式类型转换。

在C99之前的C语言中(但不在C++中),无后缀十进制数值若超出 long int 的表示范围,允许其类型为 unsigned long int

当在 #if #elif 的控制表达式中使用时,所有有符号整型常量如同具有类型 std::intmax_t ,所有无符号整型常量如同具有类型 std::uintmax_t

(since C++11)

由于 最大吞噬原则 ,以 e E 结尾的十六进制整数字面量,当其后跟随运算符 + - 时,必须在源代码中使用空白符或括号与运算符分隔:

auto x = 0xE+2.0;   // 错误
auto y = 0xa+2.0;   // 正确
auto z = 0xE +2.0;  // 正确
auto q = (0xE)+2.0; // 正确

否则,会形成一个无效的预处理数字标记,导致后续分析失败。

功能测试 标准 功能特性
__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'; // 即使没有 long long 后缀,类型也是 unsigned long long
//  std::cout << -9223372036854775808 << '\n'; // 错误:该值无法放入 signed long long,
               // 这是无后缀十进制整数字面量允许的最大类型
    std::cout << -9223372036854775808u << '\n'; // 一元减号应用于无符号值会从 2^64 中减去它,得到 9223372036854775808
    std::cout << -9223372036854775807 - 1 << '\n'; // 计算值 -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 文档 关于 integer constant