sizeof
计算为 type 的值size_t
。C99 中的正确说明符size_t
是%zu
. 您可以%u
在类型相同或至少具有相同大小和表示的size_t
系统上使用。unsigned int
在 64 位系统上,size_t
值具有 64 位,因此大于 32 位整数。在 64 位 linux 和 OS/X 上,这种类型被定义为unsigned long
and 在 64 位 Windows 上为unsigned long long
,因此在这些系统上使用%lu
or%llu
也很好。
为不兼容的转换规范传递 asize_t
具有未定义的行为:
- 程序可能会崩溃(如果你使用它可能会崩溃
%s
)
- 该程序可以显示预期值(因为它可能
%d
)
- 该程序可能会产生奇怪的输出,例如
nan
for%f
或其他东西......
原因是整数和浮点值以不同的方式传递给它们,printf
并且它们具有不同的表示形式。printf
在期望 a的地方传递一个整数double
将让我们printf
从具有随机内容的寄存器或内存位置检索浮点值。在您的情况下,浮点寄存器恰好包含一个nan
值,但它可能在程序中的其他地方或稍后包含不同的值,没有任何预期,行为未定义。
一些遗留系统不支持%zu
,尤其是 Microsoft 的 C 运行时。在这些系统上,您可以使用%u
or%lu
和使用强制转换将 the 转换size_t
为 anunsigned
或 an unsigned long
:
int a = 0;
long long d = 1000000000000;
int s = a + d;
printf("%u\n", (unsigned)sizeof(a + d)); // should print 8
printf("%lu\n", (unsigned long)sizeof(s)); // should print 4
printf("%llu\n", (unsigned long long)sizeof(d)); // prints 4 or 8 depending on the system