在C语言中,%zu和%lu有什么区别?

5
在C语言中,字符串格式化符号%zu%lu有什么区别?其中%lu用于unsigned long类型的值,而%zu用于size_t类型的值。但实际上,size_t只是一个unsigned long类型。虽然CppCheck会对此发出警告,但据我的经验,两种符号都适用于这两种类型。
那么,%zu是不是只是一种标准化的方式来格式化size_t,因为size_t常被使用,还是还有其他方面的考虑呢?

2
除非 size_t 可以是 unsigned long long,那么 %lu 就会出错,但 %zu 仍然正确。 - Jonathan Leffler
6
实际上,size_t在实现中只是一个无符号长整型。不,32位的MS VC中size_t是32位,在64位中是64位。但是long在两者中都是32位。 - Weather Vane
1
一个 unsigned long 至少有32位。size_t 至少有16位。 - chux - Reinstate Monica
1个回答

8
实际上,“size_t”只是一个“unsigned long”的别名。 但并非一定如此。存在具有32位“long”和64位“size_t”的系统,例如MSVC。
给定以下内容:
printf("long: %zu\n", sizeof(long));
printf("long long: %zu\n", sizeof(long long));
printf("size_t: %zu\n", sizeof(size_t));

在 x86 模式下使用 MSVC 2015 进行编译输出:

long: 4
long long: 8
size_t: 4

在x64模式下编译会输出:

long: 4
long long: 8
size_t: 8

size_t单独设置尺寸修改器可确保您使用正确的尺寸。


1
据我所了解,size_t的大小取决于实现和机器,并且使用%zu可以使格式化更加简便,而且独立于任何东西。我的理解正确吗? - Brogolem35
3
@Brogolem35 是的,z 修饰符专门用于 size_t,因此无论 size_t 的大小是多少,它都是正确的。 - dbush
1
在实践中,“size_t”通常与指针大小相同(但可能会有一些例外 - 编辑例如AS/400具有128位指针和32位“size_t”!)。 - Ian Abbott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接