定宽整数类型 (C++11 起)

来自cppreference.com


 
 
 
 

类型

对于下列每个标记有 (可选) 的 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.hinttypes.h)前(分别)定义了宏 __STDC_LIMIT_MACROS__STDC_CONSTANT_MACROS__STDC_FORMAT_MACROS。此建议未被任何 C++ 标准采纳,并在 C11 中被移除。然而,某些实现(例如 glibc 2.17)尝试应用此规则,而可能需要定义 __STDC 宏;C++ 编译器可以通过在某些环境中自动定义它们来做变通。

std::int8_t 可以是 signed charstd::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 文档