不說別的,先列舉幾個(gè)C語言中經(jīng)常要用到的類型
char
int
long
float
double
我們姑且只列出這幾個(gè)數(shù)據(jù)類型,我們的重點(diǎn)不是在研究各個(gè)數(shù)據(jù)類型的長度,我們都知道char是1個(gè)字節(jié)、int和float都是4個(gè)字節(jié),long和double是8個(gè)字節(jié)奈搜。重點(diǎn)的是我們要在程序中輸出各種類型的長度。是的盯荤,你猜的沒錯(cuò)馋吗,這個(gè)東西很簡單,我們可以立刻寫代碼秋秤,所以我就先不多說宏粤,先把代碼給大家貼出來脚翘。
#include? //包含標(biāo)準(zhǔn)輸入輸出函數(shù)庫
int main()
{
printf("字符型字長為%d\n",sizeof(char));
printf("整型字長為%d\n",sizeof(int));
printf("長整型字長為%d\n",sizeof(long));
printf("單精度浮點(diǎn)型字長為%d\n",sizeof(float));
printf("雙精度浮點(diǎn)型字長為%d\n",sizeof(double));
}
代碼如上,相信大家都可以看得懂吧绍哎,看不懂的要么咱們不是同一個(gè)行業(yè)来农,要不就是大學(xué)不是理科專業(yè)。接下來在linux系統(tǒng)之下來編譯這段代碼崇堰,首先在centos7執(zhí)行沃于。相關(guān)依賴的版本如下。
gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
我們將以上代碼寫在一個(gè)名為typesize.c的文件里面海诲,保存后繁莹,在命令行中輸入
gcc -o typesize.out typesize.c
執(zhí)行完上面的命令之后會(huì)生成一個(gè)typesize.out的可執(zhí)行文件,然后執(zhí)行./typesize.out
會(huì)有如下輸出
字符型字長為1
整型字長為4
長整型字長為8
單精度浮點(diǎn)型字長為4
雙精度浮點(diǎn)型字長為8
編譯特幔、執(zhí)行都沒有報(bào)錯(cuò)咨演,非常完美,當(dāng)然從一開始到現(xiàn)在是沒有問題的蚯斯。接下來我們?cè)趗buntu16.04的Linux發(fā)行版中執(zhí)行以上的操作薄风。
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
我們一樣將代碼寫在一個(gè)名為typesize.c的文件里面,保存后溉跃,執(zhí)行編譯命令
gcc -o typesize.out typesize.c
有了第一次的成功經(jīng)驗(yàn)村刨,我很自信的覺得第二次肯定沒有問題告抄,然后我在終端上看到了如下信息
typesize.c:4:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("字符型字長為%d\n",sizeof(char));
^
typesize.c:5:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("整型字長為%d\n",sizeof(int));
^
typesize.c:6:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("長整型字長為%d\n",sizeof(long));
^
typesize.c:7:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("單精度浮點(diǎn)型字長為%d\n",sizeof(float));
^
typesize.c:8:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("雙精度浮點(diǎn)型字長為%d\n",sizeof(double));
看到這里我感覺雖說C語言沒有Java那么強(qiáng)大的跨平臺(tái)性撰茎,但最起碼我在linux中寫的代碼應(yīng)該是可以公用的哇,居然發(fā)生了這樣的事情打洼,這時(shí)我的內(nèi)心是崩潰的龄糊。崩潰了之后但我還是想不明白,于是乎我硬著頭皮去看編譯時(shí)候的報(bào)錯(cuò)募疮,憑借我這個(gè)大學(xué)英語四級(jí)都不到的英語水平炫惩,我還是發(fā)現(xiàn)了端倪,說的是printf中%d期望的數(shù)據(jù)是一個(gè)int類型阿浓,但是第二個(gè)參數(shù)有l(wèi)ong unsigned int類型他嚷,也就是無符號(hào)的長整型。再仔細(xì)回憶了一下芭毙,發(fā)現(xiàn)Centos7和ubuntu16.04的gcc版本不同筋蓖,一個(gè)是4.8.xx另一個(gè)是5.4.xx,差了這么多版本退敦,我想可能是gcc的版本的影響吧粘咖。
為了確認(rèn)事實(shí)是否和我猜測的一樣,我又去ubuntu14.04的版本上去做了同樣的事情侈百。ubuntu14.04的gcc版本是gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)瓮下,我想這下應(yīng)該沒問題了翰铡,敲下了相同的編譯命令,但結(jié)果確實(shí)和16.04的時(shí)候一模一樣讽坏。簡直崩潰了锭魔。
看來centos和ubuntu也是有這么微小而又讓人頭疼的差異呀。