include 文件 <inttypes.h> 提供有助于使代码与显式指定大小的数据项兼容(无论编译环境如何)的常量、宏和派生类型。它包含用于处理 8 位、16 位、32 位和 64 位对象的机制。该文件是新的 1999 ISO/IEC C 标准的一部分,文件内容反映了导致它包含在 1999 ISO/IEC C 标准中的建议。文件即将更新,以便完全与 1999 ISO/IEC C 标准一致。<inttypes.h> 提供的基本功能包括:
定宽整型
诸如 uintptr_t 的有用类型
常量宏
限制
格式字符串宏
以下各节提供有关 <inttypes.h> 基本功能的更多信息。
<inttypes.h> 提供的定宽整型包括带符号整型(如 int8_t、int16_t、int32_t、int64_t)和无符号整型(如 uint8_t、uint16_t、uint32_t、uint64_t)。
定义为可容纳规定位数的最短整型的派生类型包括 int_least8_t、int_least64_t、uint_least8_t、uint_least64_t 等。
对于循环计数器和文件描述符等操作,使用 int 或无符号 int 是安全的;对于数组索引,使用 long 也是安全的。但是,不应不加选择地使用这些定宽类型。可将定宽类型用于下列各项的显式二进制表示:
磁盘数据
通过数据线
硬件寄存器
二进制接口规范
二进制数据结构
<inttypes.h> 文件包括大小足以容纳一个指针的带符号整型和无符号整型。这些类型以 intptr_t 和 uintptr_t 形式提供。此外,<inttypes.h> 还提供 intmax_t 和 uintmax_t,后两者是可用的最长(以位为单位)带符号整型和无符号整型。
使用 uintptr_t 类型作为指针的整型而非基本类型,如无符号 long。尽管在 ILP32 和 LP64 数据模型中,无符号 long 与指针的长度相同,但如果使用 uintptr_t,则在数据模型更改时,只有 uintptr_t 的定义受影响。这使您的代码可移植到许多其他系统中。它也是在 C 中更清楚地表达意图的方式。
需要执行地址运算时,intptr_t 和 uintptr_t 类型对于强制转换指针非常有用。因此,应使用 intptr_t 和 uintptr_t 类型,而不是 long 或无符号 long。
使用宏 INT8_C(c)、INT64_C(c)、UINT8_C(c)、UINT64_C(c) 等指定给定常量的大小和符号。基本上,必要时这些宏会在常量的末尾添上 l、ul、ll 或 ull。例如,对于 ILP32,INT64_C(1) 会在常量 1 后面附加 ll;对于 LP64,则附加 l。
可使用 INTMAX_C(c) 和 UINTMAX_C(c) 宏使常量成为最长类型。这些宏对于指定7.3 转换为 LP64 数据类型模型中介绍的常量类型会非常有用。
由 <inttypes.h> 定义的限制是用于指定各种整型的最小值和最大值的常量,其中包括每个定宽类型的最小值(如 INT8_MIN、INT64_MIN 等)和最大值(如 INT8_MAX、INT64_MAX 等)及其对应的无符号的最小值和最大值。
<inttypes.h> 文件还提供每个最短长度类型的最小值和最大值,其中包括 INT_LEAST8_MIN、INT_LEAST64_MIN、INT_LEAST8_MAX、INT_LEAST64_MAX 等及其对应的无符号的最小值和最大值。
最后,<inttypes.h> 还定义支持的最长整型的最小值和最大值,其中包括 INTMAX_MIN 和 INTMAX_MAX 及其对应的无符号的最小值和最大值。
<inttypes.h> 文件还包括指定 printf(3S) 和 scanf(3S) 格式说明符的宏。实质上,如果宏名称内置了参数的位数,这些宏将在格式说明符前面添加 l 或 ll,以便将参数标识为 long 或 long long。
printf(3S) 的宏以十进制、八进制、无符号和十六进制格式输出最短和最长整型,如以下示例所示:
int64_t i; printf("i =%" PRIx64 "\n", i); |
同样,scanf(3S) 的宏以十进制、八进制、无符号和十六进制格式读取最短和最长整型。
uint64_t u; scanf("%" SCNu64 "\n", &u); |
不要不加区别地使用这些宏。最好将它们与定宽整型中介绍的定宽类型一起使用。