定宽整数类型 (C++11 起)
类型
对于下列每个标记有 (可选) 的 typedef 名,当且仅当实现提供了对应的某个类型时,实现才会定义该 typedef 名。
在标头
<cstdint> 定义 | |
int8_tint16_tint32_tint64_tintN_t (可选)(可选)(可选)(可选)(可选) |
宽度正好是 N(典型情况有 8、16、32 和 64)位且无填充位的有符号整数类型 (typedef) |
int_fast8_tint_fast16_tint_fast32_tint_fast64_tint_fastN_t (可选) |
宽度至少有 N(典型情况有 8、16、32 和 64)位的最快的有符号整数类型 (typedef) |
int_least8_tint_least16_tint_least32_tint_least64_tint_leastN_t (可选) |
宽度至少有 N(典型情况有 8、16、32 和 64)位的最小的有符号整数类型 (如果有定义 std::intN_t,那么 std::int_leastN_t 表示相同的类型) (typedef) |
intmax_t |
最大宽度的有符号整数类型 (typedef) |
intptr_t (可选) |
足以保有指向 void 的指针的有符号整数类型 (typedef) |
uint8_tuint16_tuint32_tuint64_tuintN_t (可选)(可选)(可选)(可选)(可选) |
宽度正好是 N(典型情况有 8、16、32 和 64)位且无填充位的无符号整数类型 (typedef) |
uint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_tuint_fastN_t (可选) |
宽度至少有 N(典型情况有 8、16、32 和 64)位的最快的无符号整数类型 (typedef) |
uint_least8_tuint_least16_tuint_least32_tuint_least64_tuint_leastN_t (可选) |
宽度至少有 N(典型情况有 8、16、32 和 64)位的最小的无符号整数类型 (如果有定义 std::uintN_t,那么 std::uint_leastN_t 表示相同的类型) (typedef) |
uintmax_t |
最大宽度的无符号整数类型 (typedef) |
uintptr_t (可选) |
足以保有指向 void 的指针的无符号整数类型 (typedef) |
宏常量
对于下列每个标记有 (有条件提供) 的宏,当且仅当实现定义了对应的 typedef 名时,实现才会定义该宏。
在标头
<cstdint> 定义 | |
有符号整数:位宽 | |
INTN_WIDTH (C++26)(有条件提供) |
std::intN_t 的位宽(N 的典型情况有 8、16、32 和 64) (宏常量) |
INT_FASTN_WIDTH (C++26)(有条件提供) |
std::int_fastN_t 的位宽(N 的典型情况有 8、16、32 和 64) (宏常量) |
INT_LEASTN_WIDTH (C++26)(有条件提供) |
std::int_leastN_t 的位宽(N 的典型情况有 8、16、32 和 64) (宏常量) |
INTMAX_WIDTH (C++26) |
std::intmax_t 的位宽 (宏常量) |
INTPTR_WIDTH (C++26)(有条件提供) |
std::intptr_t 的位宽 (宏常量) |
有符号整数:最小值 | |
INTN_MIN (有条件提供) |
std::intN_t 的最小值(N 的典型情况有 8、16、32 和 64) (宏常量) |
INT_FASTN_MIN (有条件提供) |
std::int_fastN_t 的最小值(N 的典型情况有 8、16、32 和 64) (宏常量) |
INT_LEASTN_MIN (有条件提供) |
std::int_leastN_t 的最小值(N 的典型情况有 8、16、32 和 64) (宏常量) |
INTPTR_MIN (有条件提供) |
std::intptr_t 的最小值 (宏常量) |
INTMAX_MIN |
std::intmax_t 的最小值 (宏常量) |
有符号整数:最大值 | |
INTN_MAX (有条件提供) |
std::intN_t 的最大值(N 的典型情况有 8、16、32 和 64) (宏常量) |
INT_FASTN_MAX (有条件提供) |
std::int_fastN_t 的最大值(N 的典型情况有 8、16、32 和 64) (宏常量) |
INT_LEASTN_MAX (有条件提供) |
std::int_leastN_t 的最大值(N 的典型情况有 8、16、32 和 64) (宏常量) |
INTPTR_MAX (有条件提供) |
std::intptr_t 的最大值 (宏常量) |
INTMAX_MAX |
std::intmax_t 的最大值 (宏常量) |
无符号整数:位宽 | |
UINTN_WIDTH (C++26)(有条件提供) |
std::uintN_t 的位宽(N 的典型情况有 8、16、32 和 64) (宏常量) |
UINT_FASTN_WIDTH (C++26)(有条件提供) |
std::uint_fastN_t 的位宽(N 的典型情况有 8、16、32 和 64) (宏常量) |
UINT_LEASTN_WIDTH (C++26)(有条件提供) |
std::uint_leastN_t 的位宽(N 的典型情况有 8、16、32 和 64) (宏常量) |
UINTMAX_WIDTH (C++26) |
std::uintmax_t 的位宽 (宏常量) |
UINTPTR_WIDTH (C++26)(有条件提供) |
std::uintptr_t 的位宽 (宏常量) |
无符号整数:最大值 | |
UINTN_MAX (有条件提供) |
std::uintN_t 的最大值(N 的典型情况有 8、16、32 和 64) (宏常量) |
UINT_FASTN_MAX (有条件提供) |
std::uint_fastN_t 的最大值(N 的典型情况有 8、16、32 和 64) (宏常量) |
UINT_LEASTN_MAX (有条件提供) |
std::uint_leastN_t 的最大值(N 的典型情况有 8、16、32 和 64) (宏常量) |
UINTPTR_MAX (有条件提供) |
std::uintptr_t 的最大值 (宏常量) |
UINTMAX_MAX |
std::uintmax_t 的最大值 (宏常量) |
函数宏
对于下列每个标记有 (有条件提供) 的宏,当且仅当实现定义了对应的 typedef 名时,实现才会定义该宏。
在标头
<cstdint> 定义 | |
INTN_C (有条件提供) |
展开成 std::int_leastN_t 类型的整数常量表达式,它的值由实参指定 (宏函数) |
INTMAX_C |
展开成 std::intmax_t 类型的整数常量表达式,它的值由实参指定 (宏函数) |
UINTN_C (有条件提供) |
展开成 std::uint_leastN_t 类型的整数常量表达式,它的值由实参指定 (宏函数) |
UINTMAX_C |
展开成 std::uintmax_t 类型的整数常量表达式,它的值由实参指定 (宏函数) |
#include <cstdint>
UINT64_C(0x123) // 展开成类型为 uint64_t 而值为 0x123 的字面量
格式宏常量
在标头
<cinttypes> 定义 |
std::fprintf 系列函数的格式宏常量
此处列出的每个 PRI 宏当且仅当实现定义了对应的 typedef 名时才得以定义。
int 或unsigned int的等价者 |
描述 | 数据类型的宏 | ||||
|---|---|---|---|---|---|---|
std::intx_t |
std::int_leastx_t |
std::int_fastx_t |
std::intmax_t |
std::intptr_t | ||
d
|
有符号十进制整数值的输出 | PRIdx | PRIdLEASTx | PRIdFASTx | PRIdMAX | PRIdPTR |
i
|
PRIix | PRIiLEASTx | PRIiFASTx | PRIiMAX | PRIiPTR | |
u
|
无符号十进制整数值的输出 | PRIux | PRIuLEASTx | PRIuFASTx | PRIuMAX | PRIuPTR |
o
|
无符号八进制整数值的输出 | PRIox | PRIoLEASTx | PRIoFASTx | PRIoMAX | PRIoPTR |
x
|
无符号小写十六进制整数值的输出 | PRIxx | PRIxLEASTx | PRIxFASTx | PRIxMAX | PRIxPTR |
X
|
无符号大写十六进制整数值的输出 | PRIXx | PRIXLEASTx | PRIXFASTx | PRIXMAX | PRIXPTR |
std::fscanf 系列函数的格式宏常量
此处列出的每个 SCN 宏当且仅当实现定义了对应的 typedef 名且拥有适合该类型的 std::fscanf 长度修饰符时才得以定义。
int 或unsigned int的等价者 |
描述 | 数据类型的宏 | ||||
|---|---|---|---|---|---|---|
std::intx_t |
std::int_leastx_t |
std::int_fastx_t |
std::intmax_t |
std::intptr_t | ||
d
|
有符号十进制整数值的输入 | SCNdx | SCNdLEASTx | SCNdFASTx | SCNdMAX | SCNdPTR |
i
|
有符号整数值的输入 | SCNix | SCNiLEASTx | SCNiFASTx | SCNiMAX | SCNiPTR |
u
|
无符号十进制整数值的输入 | SCNux | SCNuLEASTx | SCNuFASTx | SCNuMAX | SCNuPTR |
o
|
无符号八进制整数值的输入 | SCNox | SCNoLEASTx | SCNoFASTx | SCNoMAX | SCNoPTR |
x
|
无符号十六进制整数值的输入 | SCNxx | SCNxLEASTx | SCNxFASTx | SCNxMAX | SCNxPTR |
注解
因为 C++ 会将后面紧跟一个字符的字符串字面量判读为用户定义字面量,所以诸如 printf("%"PRId64"\n",n); 这样的 C 代码在 C++ 中非法,并要求 PRId64 前要有空格。
C99 标准建议 C++ 实现不应定义上述极限、常量或格式化宏,除非在包含相对的 C 标头(stdint.h 或 inttypes.h)前(分别)定义了宏 __STDC_LIMIT_MACROS、__STDC_CONSTANT_MACROS 或 __STDC_FORMAT_MACROS。此建议未被任何 C++ 标准采纳,并在 C11 中被移除。然而,某些实现(例如 glibc 2.17)尝试应用此规则,而可能需要定义 __STDC 宏;C++ 编译器可以通过在某些环境中自动定义它们来做变通。
std::int8_t 可以是 signed char,std::uint8_t 也可以是 unsigned char,但两者都不能是 char(因为 char 既不视为“有符号整数类型”也不视为“无符号整数类型”)。
示例
#include <cinttypes>
#include <cstdio>
int main()
{
std::printf("%zu\n", sizeof(std::int64_t));
std::printf("%s\n", PRId64);
std::printf("%+" PRId64 "\n", INT64_MIN);
std::printf("%+" PRId64 "\n", INT64_MAX);
std::int64_t n = 7;
std::printf("%+" PRId64 "\n", n);
}
可能的输出:
8
lld
-9223372036854775808
+9223372036854775807
+7
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2820 | C++11 | 可选的 typedef 名与宏的要求与 C 不一致 | 使得一致 |
引用
- C++23 标准(ISO/IEC 14882:2024):
- 17.4.1 Header <cstdint> synopsis [cstdint.syn]
- 31.13.2 Header <cinttypes> synopsis [cinttypes.syn]
- C++20 标准(ISO/IEC 14882:2020):
- 17.4 Integer types [cstdint]
- 29.12.2 Header <cinttypes> synopsis [cinttypes.syn]
- C++17 标准(ISO/IEC 14882:2017):
- 21.4 Integer types [cstdint]
- 30.11.2 Header <cinttypes> synopsis [cinttypes.syn]
- C++14 标准(ISO/IEC 14882:2014):
- 18.4 Integer types [cstdint]
- 27.9.2 C library files [c.files]
- C++11 标准(ISO/IEC 14882:2011):
- 18.4 Integer types [cstdint]
- 27.9.2 C library files [c.files]
参阅
定宽整数类型的 C 文档
|