2011-02-14 93 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

相關問題