我知道%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
。
%zd
是事实上的标准,而不是法律上的标准。没有后者用于打印ssize_t
,这是由POSIX(不是C)定义的类型。