为什么在引用int变量的大小时我必须使用%ld?

tnb*_*nbt -1 c printf

我像这样定义一个int:

int a;
Run Code Online (Sandbox Code Playgroud)

当我想查找这个int的大小时,我必须使用格式说明符%ld,如下所示:

printf("int size is %ld\n", sizeof(a));
Run Code Online (Sandbox Code Playgroud)

当我使用%d作为格式说明符时,我收到以下错误:

foo.c:7:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
    printf("int size is %d\n", sizeof(a));
Run Code Online (Sandbox Code Playgroud)

问题是,当函数的参数为​​int时,为什么sizeof()的结果定义为long unsigned int?

Bil*_*nch 7

sizeof(anything)is 的类型size_t,是一些无符号整数常量.要打印它,你应该使用%zu.


Vla*_*cow 5

根据C标准(6.5.3.4 sizeof和alignof运算符)

5两个运算符的结果值是实现定义的,其类型(无符号整数类型)是size_t,在<stddef.h>(和其他标题)中定义 .

和(7.19共同定义<stddef.h>)

size_t是sizeof运算符的结果的无符号整数类型;

和(7.21.6.1 fprintf函数)

z指定以下d,i,o,u,x或X转换说明符适用于size_t ....

因此,写得更准确

printf( "int size is %zu\n", sizeof( a ) );
                     ^^^
Run Code Online (Sandbox Code Playgroud)

运算符sizeof应用于什么类型的对象并不重要.它返回给定类型的对象占用的字节数,返回的数字具有类型size_t.

您的编译器会发出警告,因为系统类型size_t 的定义与unsigned long int您正在使用的类似signed int.当您使用格式说明符时,似乎不会发出警告,%ld因为签名的long int类型的等级等于与size_t对应的unsigned long int类型的等级.