使用 zd 与 lu 来确定 sizeof

问题描述

我了解 %zd 是格式化 sizeof 结果的建议方式。但是,我不明白为什么这是必要的。例如,使用 lu 给我相同的输出,而且 sizeof 的结果不是 unsigned long 吗?例如:

printf("Sizeof(char): %lu,Sizeof(short): %lu,Sizeof(int): %lu,Sizeof(long): %lu,Sizeof(long long): %lu,Sizeof(float): %lu,Sizeof(double): %lu,Sizeof(long double): %lu\n",sizeof(char),sizeof(short),sizeof(int),sizeof(long),sizeof(long long),sizeof(float),sizeof(double),sizeof(long double));
printf("Sizeof(char): %zd,Sizeof(short): %zd,Sizeof(int): %zd,Sizeof(long): %zd,Sizeof(long long): %zd,Sizeof(float): %zd,Sizeof(double): %zd,Sizeof(long double): %zd",sizeof(long double));

Sizeof(char): 1,Sizeof(short): 2,Sizeof(int): 4,Sizeof(long): 8,Sizeof(long long): 8,Sizeof(float): 4,Sizeof(double) : 8,Sizeof(long double): 16
Sizeof(char): 1,Sizeof(double): 8,Sizeof(long double): 16

使用 %zd 的原因或优势是什么?为什么首先要添加它?

解决方法

无论如何,sizeof 的结果不是 unsigned long 吗?

不,它返回一个 size_t,并且 size_t 不需要与 unsigned long 的大小相同。

例如,在 Windows 世界中,unsigned long 是 32 位,size_t 是 64 位。

我了解 %zd 是格式化 sizeof 结果的建议方式。

不完全。

%zu 用于 size_t(或 %zX%zx%zo
%zd 用于 ssize_t

由于 sizeof 返回 size_t,因此您需要 %zu

,

运算符 sizeof 返回的值的类型为 size_t

来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)

5 两个运算符的结果值是实现定义的, 它的类型(无符号整数类型)是 size_t,定义在 (和其他标题)。

类型 size_t 是实现定义的无符号整数类型。通常它被定义为 unsigned long 类型的别名,尽管 C 标准不要求这样做。特别是标准允许 size_t 类型的等级可以大于 unsigned long 类型的等级。

来自 C 标准(7.19 通用定义

4 用于 size_t 和 ptrdiff_t 的类型不应有整数 转换等级大于 signed long int 的等级,除非 实现支持足够大的对象,使其成为必要。

因此要输出 size_t 类型的值,您应该使用转换说明符 zu