【发布时间】:2021-04-15 11:00:42
【问题描述】:
我了解%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): %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, Sizeof(double): 8, Sizeof(long double): 16
使用%zd 的原因或优势是什么?为什么首先添加它?
【问题讨论】:
-
sizeof的结果是size_t,它可能与unsigned long相同也可能不同,具体取决于您使用的编译器、操作系统和处理器。格式说明符是%zu,因为size_t是无符号的。 -
我想说because Microsoft...(但实际上他们可能不是唯一的)。
-
@user3386109 我明白了,
size_t也像typedef size_t int或typedef size_t <something-else>一样取决于平台? -
检查this回答。
-
如果
size_t和unsigned long和unsigned int都是 32 位大小(也可以是),那么使用%zu或%lu或 @987654342 都没有关系@,但代码不可移植。这就是为什么您需要使用正确的说明符——以便printf()知道传递的参数的大小。它所拥有的只是来自格式说明符的 promise 并且必须相信调用者传递了正确大小的操作数。没有别的办法知道,由程序员来匹配格式和类型。
标签: c printf size-t conversion-specifier