0

我知道这%zd是格式化sizeof结果的建议方法。但是,我不明白为什么这是必要的。例如 usinglu给了我相同的输出,而且不是sizeofunsigned 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(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long), sizeof(float), sizeof(double), 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(short): 2, Sizeof(int): 4, Sizeof(long): 8, Sizeof(long long): 8, Sizeof(float): 4,大小(双):8,大小(长双):16

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

4

2 回答 2

2

sizeof反正不是无符号长的结果吗?

不,它返回 a size_t,并且 asize_t不需要与 a 大小相同unsigned long

例如,在 Windows 世界中,anunsigned long是 32 位,asize_t是 64 位。

我知道这%zd是格式化sizeof结果的建议方法。

不完全的。

用于(或,或) 用于%zu_size_t%zX%zx%zo
%zdssize_t

由于sizeof返回 a size_t,因此您想要%zu.

于 2021-01-10T08:04:23.887 回答
1

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

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

5 两个运算符的结果值是实现定义的,其类型(无符号整数类型)是 size_t,在 <stddef.h>(和其他头文件)中定义。

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

来自 C 标准(7.19 通用定义 <stddef.h>)

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

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

于 2021-01-10T07:59:53.340 回答