固定宽度整数类型 (自 C++11 起)
内容 |
[编辑] 类型
在头文件
<cstdint> 中定义 | |
int8_tint16_tint32_tint64_t (可选) |
分别具有 8、16、32 和 64 位宽度的带符号整数类型 没有填充位,使用 2 的补码表示负值 (仅当实现直接支持该类型时才提供) (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 (可选) |
能够保存指向 void 的指针的带符号整数类型 (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 (可选) |
能够保存指向 void 的指针的无符号整数类型 (typedef) |
实现可以定义 typedef 名字 intN_t
、int_fastN_t
、int_leastN_t
、uintN_t
、uint_fastN_t
和 uint_leastN_t
,其中 N 不为 8、16、32 或 64。仅当实现支持具有该宽度且没有填充位的整数类型时,才能定义形式为 intN_t
的 typedef 名字。因此,std::uint24_t
表示宽度正好为 24 位的无符号整数类型。
下面列出的每个宏仅当实现定义了相应的 typedef 名字时才会定义。宏 INTN_C
和 UINTN_C
分别对应于 typedef 名字 int_leastN_t
和 uint_leastN_t
。
[编辑] 宏常量
在头文件
<cstdint> 中定义 | |
带符号整数:最小值 | |
INT8_MININT16_MININT32_MININT64_MIN (可选) |
分别为 std::int8_t 、std::int16_t 、std::int32_t 和 std::int64_t 的最小值(宏常量) |
INT_FAST8_MININT_FAST16_MININT_FAST32_MININT_FAST64_MIN |
分别为 std::int_fast8_t 、std::int_fast16_t 、std::int_fast32_t 和 std::int_fast64_t 的最小值(宏常量) |
INT_LEAST8_MININT_LEAST16_MININT_LEAST32_MININT_LEAST64_MIN |
分别为 std::int_least8_t 、std::int_least16_t 、std::int_least32_t 和 std::int_least64_t 的最小值(宏常量) |
INTPTR_MIN (可选) |
std::intptr_t 的最小值(宏常量) |
INTMAX_MIN |
std::intmax_t 的最小值(宏常量) |
带符号整数:最大值 | |
INT8_MAXINT16_MAXINT32_MAXINT64_MAX (可选) |
分别为 std::int8_t 、std::int16_t 、std::int32_t 和 std::int64_t 的最大值(宏常量) |
INT_FAST8_MAXINT_FAST16_MAXINT_FAST32_MAXINT_FAST64_MAX |
分别为 std::int_fast8_t 、std::int_fast16_t 、std::int_fast32_t 和 std::int_fast64_t 的最大值(宏常量) |
INT_LEAST8_MAXINT_LEAST16_MAXINT_LEAST32_MAXINT_LEAST64_MAX |
分别为 std::int_least8_t 、std::int_least16_t 、std::int_least32_t 和 std::int_least64_t 的最大值(宏常量) |
INTPTR_MAX (可选) |
std::intptr_t 的最大值(宏常量) |
INTMAX_MAX |
std::intmax_t 的最大值(宏常量) |
无符号整数:最大值 | |
UINT8_MAXUINT16_MAXUINT32_MAXUINT64_MAX (可选) |
分别为 std::uint8_t 、std::uint16_t 、std::uint32_t 和 std::uint64_t 的最大值(宏常量) |
UINT_FAST8_MAXUINT_FAST16_MAXUINT_FAST32_MAXUINT_FAST64_MAX |
分别为 std::uint_fast8_t 、std::uint_fast16_t 、std::uint_fast32_t 和 std::uint_fast64_t 的最大值(宏常量) |
UINT_LEAST8_MAXUINT_LEAST16_MAXUINT_LEAST32_MAXUINT_LEAST64_MAX |
分别为 std::uint_least8_t 、std::uint_least16_t 、std::uint_least32_t 和 std::uint_least64_t 的最大值(宏常量) |
UINTPTR_MAX (可选) |
std::uintptr_t 的最大值(宏常量) |
UINTMAX_MAX |
std::uintmax_t 的最大值(宏常量) |
[编辑] 最小宽度整数常量的函数宏
INT8_CINT16_CINT32_CINT64_C |
分别扩展为一个整数常量表达式,其值为其参数指定的值,其类型为 std::int_least8_t 、std::int_least16_t 、std::int_least32_t 和 std::int_least64_t 的 提升 类型(函数宏) |
INTMAX_C |
扩展为一个整数常量表达式,其值为其参数指定的值,其类型为 std::intmax_t (函数宏) |
UINT8_CUINT16_CUINT32_CUINT64_C |
分别扩展为一个整数常量表达式,其值为其参数指定的值,其类型为 std::uint_least8_t 、std::uint_least16_t 、std::uint_least32_t 和 std::uint_least64_t 的 提升 类型(函数宏) |
UINTMAX_C |
扩展为一个整数常量表达式,其值为其参数指定的值,其类型为 std::uintmax_t (函数宏) |
#include <cstdint> UINT64_C(0x123) // expands to a literal of type uint_least64_t and value 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(分别对应)。此建议未被任何 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++ 标准。
DR | 应用于 | 发布的行为 | 正确行为 |
---|---|---|---|
LWG 2820 | C++11 | 可选 typedef 名称和宏的要求与 C 不一致 | 保持一致 |
[编辑] 参考资料
- C++23 标准 (ISO/IEC 14882:2024)
- 17.4.1 头文件 <cstdint> 概要 [cstdint.syn]
- 31.13.2 头文件 <cinttypes> 概要 [cinttypes.syn]
- C++20 标准 (ISO/IEC 14882:2020)
- 17.4 整数类型 [cstdint]
- 29.12.2 头文件 <cinttypes> 概要 [cinttypes.syn]
- C++17 标准 (ISO/IEC 14882:2017)
- 21.4 整数类型 [cstdint]
- 30.11.2 头文件 <cinttypes> 概要 [cinttypes.syn]
- C++14 标准 (ISO/IEC 14882:2014)
- 18.4 整数类型 [cstdint]
- 27.9.2 C 库文件 [c.files]
- C++11 标准 (ISO/IEC 14882:2011)
- 18.4 整数类型 [cstdint]
- 27.9.2 C 库文件 [c.files]
[编辑] 另请参见
C 文档 用于 固定宽度整数类型
|