定宽整数类型 (C++11 起)
类型
定义于头文件
<cstdint> | |
int8_tint16_tint32_tint64_t (可选) |
分别为宽度恰为 8、16、32 和 64 位的有符号整数类型 无填充位并对负值使用补码 (仅若实现支持该类型才提供) (typedef) |
int_fast8_tint_fast16_tint_fast32_tint_fast64_t |
分别为宽度至少有 8、16、32 和 64 位的最快的有符号整数类型 (typedef) |
int_least8_tint_least16_tint_least32_tint_least64_t |
分别为宽度至少有 8、16、32 和 64 位的最小的有符号整数类型 (typedef) |
intmax_t |
最大宽度的有符号整数类型 (typedef) |
intptr_t (可选) |
足以保有指针的有符号整数类型 (typedef) |
uint8_tuint16_tuint32_tuint64_t (可选) |
宽度恰为 8、16、32 和 64 位的无符号整数类型 (仅若实现支持该类型才提供) (typedef) |
uint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_t |
分别为宽度至少有 8、16、32 和 64 位的最快无符号整数类型 (typedef) |
uint_least8_tuint_least16_tuint_least32_tuint_least64_t |
分别为宽度至少有 8、16、32 和 64 位的最小无符号整数类型 (typedef) |
uintmax_t |
最大宽度的无符号整数类型 (typedef) |
uintptr_t (可选) |
足以保有指针的无符号整数类型 (typedef) |
实现可在 N 不是 8、 16、 32 或 64 时定义 typedef 名 intN_t
、 int_fastN_t
、 int_leastN_t
、 uintN_t
、 uint_fastN_t
及 uint_leastN_t
。形为 intN_t
的 typedef 名仅若实现支持有该宽度而无填充的整数类型才可以得以定义。从而 uint24_t 代表宽度准确地为 24 位的无符号整数类型。
下面列出的每个宏当且仅当实现定义对应的 typedef 名时才得以定义。宏 INTN_C
与 UINTN_C
分别对应 typedef 名 int_leastN_t
与 uint_leastN_t
。
宏常量
定义于头文件
<cstdint> | |
有符号整数:最小值 | |
INT8_MININT16_MININT32_MININT64_MIN (可选) |
int8_t、int16_t、int32_t、int64_t 类型对象的最小值 (宏常量) |
INT_FAST8_MININT_FAST16_MININT_FAST32_MININT_FAST64_MIN |
int_fast8_t、int_fast16_t、int_fast32_t、int_fast64_t 类型对象的最小值 (宏常量) |
INT_LEAST8_MININT_LEAST16_MININT_LEAST32_MININT_LEAST64_MIN |
int_least8_t、int_least16_t、int_least32_t、int_least64_t 类型对象的最小值 (宏常量) |
INTPTR_MIN (可选) |
intptr_t 类型对象的最小值 (宏常量) |
INTMAX_MIN |
intmax_t 类型对象的最小值 (宏常量) |
有符号整数:最大值 | |
INT8_MAXINT16_MAXINT32_MAXINT64_MAX (可选) |
int8_t、int16_t、int32_t、int64_t 类型对象的最大值 (宏常量) |
INT_FAST8_MAXINT_FAST16_MAXINT_FAST32_MAXINT_FAST64_MAX |
int_fast8_t、int_fast16_t、int_fast32_t、int_fast64_t 类型对象的最大值 (宏常量) |
INT_LEAST8_MAXINT_LEAST16_MAXINT_LEAST32_MAXINT_LEAST64_MAX |
int_least8_t、int_least16_t、int_least32_t、int_least64_t 类型对象的最大值 (宏常量) |
INTPTR_MAX (可选) |
intptr_t 类型对象的最大值 (宏常量) |
INTMAX_MAX |
intmax_t 类型对象的最大值 (宏常量) |
无符号整数:最大值 | |
UINT8_MAXUINT16_MAXUINT32_MAXUINT64_MAX (可选) |
uint8_t、uint16_t、uint32_t、uint64_t 类型对象的最大值 (宏常量) |
UINT_FAST8_MAXUINT_FAST16_MAXUINT_FAST32_MAXUINT_FAST64_MAX |
uint_fast8_t、uint_fast16_t、uint_fast32_t、uint_fast64_t 类型对象的最大值 (宏常量) |
UINT_LEAST8_MAXUINT_LEAST16_MAXUINT_LEAST32_MAXUINT_LEAST64_MAX |
uint_least8_t、uint_least16_t、uint_least32_t、uint_least64_t 类型对象的最大值 (宏常量) |
UINTPTR_MAX (可选) |
uintptr_t 类型对象的最大值 (宏常量) |
UINTMAX_MAX |
uintmax_t 类型对象的最大值 (宏常量) |
最小宽度整数常量的函数宏
INT8_CINT16_CINT32_CINT64_C |
展开成拥有其实参所指定的值且类型分别为 int_least8_t、int_least16_t、int_least32_t、int_least64_t 的提升类型的整数常量表达式 (宏函数) |
INTMAX_C |
展开成拥有其实参所指定的值且类型为 intmax_t 的整数常量表达式 (宏函数) |
UINT8_CUINT16_CUINT32_CUINT64_C |
展开成拥有其实参所指定的值且类型分别为 uint_least8_t、uint_least16_t、uint_least32_t、uint_least64_t 的提升类型的整数常量表达式 (宏函数) |
UINTMAX_C |
展开成拥有其实参所指定的值且类型为 uintmax_t 的整数常量表达式 (宏函数) |
#include <cstdint> UINT64_C(0x123) // 展开成类型为 uint64_t 而值为 0x123 的字面量
格式宏常量
定义于头文件
<cinttypes> |
std::fprintf 系列函数的格式宏常量
此处列出的每个 PRI
宏当且仅当实现定义对应的 typedef 名才得以定义。
int 或 unsigned int 的等价者 |
描述 | 数据类型的宏 | ||||
---|---|---|---|---|---|---|
std::int x_t |
std::int_least x_t |
std::int_fast x_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::int x_t |
std::int_least x_t |
std::int_fast x_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
。此建议未被采纳,并在 C11 中被移除。然而,某些实现(例如 glibc 2.17 )尝试应用此规则,而可能需要定义 __STDC
宏; C++ 编译器可以通过在某些环境自动定义它们来做变通。
示例
#include <cstdio> #include <cinttypes> 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++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2820 | C++11 | 可选的 typedef 名与宏的要求与 C 不一致 | 使得一致 |
引用
- 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]