PRId32、PRIu64 使用介绍

  • Post author:
  • Post category:其他

1.实现确定大小的整数类型
对于我们的程序来说,有些时候需要确定大小的表示来编码数据类型,比如在因特网上的通信需要机器按照一个标准协议在因特网上通信,因此让数据类型与协议指定的数据额类型兼容有时候十分重要,比如在windows32位和64位系统中我们会看到各数据类型些许的差别。
在这里插入图片描述
在这张图片中我们可以看出在数据类型long中,32位操作系统分配4个字节,而64位系统分配了8个字节,这同时导致了它们不同的取值范围,而实际上C语言标准只制指定了 每种数据结构类型的最小范围,而不是确定的范围,我们也可以选择大多数机器上的标准表示兼容的数据类型,但是这也不能表示可移植性。
2.解决方案
ISO C99在标准在文件stdint.h中引入了这个整数类型类,这个文件中定义了一组数据类型,形如 intN_t 和 unitN_t 分别表示对不同的N值指定N位有符号和无符号的整数。

这样可以确定数据额的宽度,它们的打印需要使用宏,其以与系统相关的方式扩展为格式串,示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
 
int main()
{
    int32_t x = 6;
    uint64_t y = 120;
    printf("x = %" PRId32 ",y = %" PRIu64 "\n",x,y);
    return 0;
}

输出结果:

x = 6,y = 120

其中以 int32_ t 为例其代表一个有符号的整数,在标准库stdint.h中,宏PRId32和PRIu64在inttypes.h中,其内部包括与整数有关的宏,详情请查看下方连接

intyypes.h: https://pubs.opengroup.org/onlinepubs/009695399/basedefs/inttypes.h.html

当编译为64位程序时,宏 PRId32 展示形成字符串 “d” 宏PRIu64展示形成字符串 “lu”。

因此示例中printf的调用就转化为

printf(“x = %d, y = %lu\n”, x, y);
因此使用宏能保证:无论代码是如何被编译的,都能生成正确的格式字符串。