2011-02-14 95 views
3
[email protected]:~/langs/c$ cat 3264int.c 
#include <stdio.h> 
int main(){ 
     long z; 
    printf("Long int size is %d bytes long!\n", sizeof(z)); 

    return 0; 
} 
[email protected]:~/langs/c$ cat 3264int.c ^C 
[email protected]:~/langs/c$ gcc -m32 -o 32int 3264int.c 
[email protected]:~/langs/c$ gcc -m64 -o 64int 3264int.c 
3264int.c: In function ‘main’: 
3264int.c:4: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ cat 3264int.c 

我试图改变类型z为int,它仍然无法编译。为什么我可以在32位而不是64位编译这个?

回答

5

这是一个警告,而不是一个错误。你有一个结果可执行文件。但是,如果您尝试使用-pedantic-Werror进行编译,那么您不会。但是,如果这个微示例是你正在处理的内容,那么你需要做的是将你的格式说明符更改为%ld。在你的平台size_t这是什么sizeof将返回,可能是64位的8个字节,但32位的4个字节。 %d可以显示32位整数,但不能显示64位整数。

4

sizeof运算符返回size_t。在32位版本的平台上,它的大小与32位int相同(即它最可能是无符号整数或长整型无符号整数,对于32位版本,这两者可能都是32位) 。在64位版本中,它是一个长整型无符号整数,它是64位的。 %d用于整数,而32位和64位版本的整数都是32位。

解决这个困境的方法是:

科协的sizeof结果到一个定义良好的平台独立型 - 无符号整型或更好,但unsigned long类型,然后使用“%U”或“%鲁” ,分别作为printf格式化字符。

或者,您可以:

使用%祖格式规范,which directly supports size_t

+0

`%zu`不是gcc特有的,实际上编译器与`printf`(库函数)支持的内容无关。 `%zu`是ANSI/ISO C语言的标准部分,已有10多年的历史。 – 2011-02-14 04:37:45

相关问题