我像这样定义一个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?
根据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类型的等级.
| 归档时间: |
|
| 查看次数: |
7454 次 |
| 最近记录: |