c语言 - zd 与 lu 的用法



我知道%zd是格式化sizeof结果的建议方法。但是,我不明白为什么这是必要的。例如,使用lu给了我相同的输出,无论如何,sizeof的结果不是无符号的长吗?例如:

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): %lun"
,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));
大小(字符): 1, 大小(短): 2, 大小(整数): 4, 大小(长): 8, 长尺寸): 8, 大小(浮点): 4, 大小(双精度): 8, 大小(长双精度): 16
大小(字符): 1, 大小(短): 2, 大小(整数): 4, 大小(长): 8, 大小(长): 8, 大小(浮点): 4, 大小(双精度

): 8, 大小(长双精度): 16

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

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

来自 C 标准(6.5.3.4 运算符的大小和对齐方式)

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

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

来自 C 标准(7.19 通用定义)

4 用于size_t和ptrdiff_t的类型不应有整数 转换排名大于有符号长整型的转换排名,除非 实现支持足够大的对象,因此有必要这样做。

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

无论如何,

sizeof的结果不是一个无符号的长吗?

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

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

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

差一点。

%zu用于size_t(或%zX%zx%zo)
%zd用于ssize_t[1]

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


  1. %zd事实上的标准,而不是法律上的标准。没有后者用于打印ssize_t,这是由POSIX(不是C)定义的类型。

最新更新