定宽整数类型 (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 (可選) |
足以保有指向 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) |
實現可在 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 名只有在實現支持有該寬度而無填充的整數類型才可以定義。從而 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) // 展开成类型为 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 文檔
|