前沿拓展:c語(yǔ)言 整形占多少個(gè)字節(jié)

一個(gè)字符一個(gè)字節(jié) 共8位(bit)
可以用sizeof(類(lèi)型)來(lái)測(cè)試

還記得在《兩分鐘弄懂C語(yǔ)言為什么要定義不同的數(shù)據(jù)類(lèi)型,有多注重細(xì)節(jié)》一節(jié)中,我們提到 C 語(yǔ)言定義了不同的數(shù)據(jù)類(lèi)型嗎?不同數(shù)據(jù)類(lèi)型使得 C 語(yǔ)言更加靈活,解決問(wèn)題時(shí),選擇合適的數(shù)據(jù)類(lèi)型,能夠大大提升程序終的效率。本節(jié),我們?cè)偌?xì)說(shuō)說(shuō) C 語(yǔ)言的數(shù)據(jù)類(lèi)型。

C 語(yǔ)言中的數(shù)據(jù)類(lèi)型

整型

計(jì)算機(jī)存儲(chǔ)的小單位是字節(jié)(Byte),一個(gè)字節(jié)通常是 8 個(gè) bit。我們常說(shuō)的硬盤(pán)容量 500GB,就是指硬盤(pán)能夠存儲(chǔ) 500G 字節(jié)的數(shù)據(jù)。C 語(yǔ)言規(guī)定 char 型占一個(gè)字節(jié)的存儲(chǔ)空間,如果是 unsigned char(無(wú)符號(hào)),則可表示的取值范圍是 0~255。如果是 signed char(有符號(hào)),則取值范圍為 -128~127。

定義 char 型變量時(shí)不指定 unsigned 或 signed ,C標(biāo)準(zhǔn)規(guī)定這種情況屬于 implemention defined,具體 char 型變量是否有符號(hào)取決于使用的編譯器。C 標(biāo)準(zhǔn)的原則是:優(yōu)先考慮效率,可移植性其次。所以如果在對(duì)應(yīng)的體系架構(gòu)上,char 型變量有符號(hào)時(shí)效率高,則編譯器就將其解釋為有符號(hào)。若char 型變量無(wú)符號(hào)時(shí)效率高,則編譯器就將其解釋為無(wú)符號(hào)。

應(yīng)該沒(méi)有人故意寫(xiě)出沒(méi)有移植性的代碼,所以建議寫(xiě) C 語(yǔ)言代碼用到 char 型變量時(shí),顯性的指出其是否有符號(hào)。

另外,整型數(shù)據(jù)類(lèi)型還有 short int(可簡(jiǎn)寫(xiě)為 short),int, long int(可簡(jiǎn)寫(xiě)為 long),long long int(可簡(jiǎn)寫(xiě)為 long long)幾種,這些類(lèi)型也可以加上 unsigned 或 signed 表示無(wú)符號(hào)型或有符號(hào)型,與 char 類(lèi)型的區(qū)別主要在于占用的存儲(chǔ)空間不同,究竟這幾種整型類(lèi)型占幾個(gè)字節(jié),C 標(biāo)準(zhǔn)沒(méi)有規(guī)定,所以在不同架構(gòu)的計(jì)算機(jī)中,這幾種類(lèi)型占用的空間可能不同。例如在大多數(shù) 32 位計(jì)算機(jī)中,這幾種數(shù)據(jù)類(lèi)型占用的字節(jié)數(shù)分別為 2,4,4,8。而在大多數(shù) 64 位計(jì)算機(jī)中,這幾種數(shù)據(jù)類(lèi)型占用的字節(jié)數(shù)分別為 2,4,8,8。

除了 char,其他幾種整型類(lèi)型如果定義時(shí)沒(méi)有寫(xiě)符號(hào),則默認(rèn)為是有符號(hào)的。

浮點(diǎn)型

C 標(biāo)準(zhǔn)規(guī)定的浮點(diǎn)型有 float,double,long double,但是對(duì)每種數(shù)據(jù)類(lèi)型占用的存儲(chǔ)空間卻沒(méi)有規(guī)定。浮點(diǎn)型的實(shí)現(xiàn)在不同的平臺(tái)上的差異性比整型更大。有的處理器自帶的有浮點(diǎn)運(yùn)算單元,稱(chēng)為浮點(diǎn)運(yùn)算的硬件實(shí)現(xiàn)。有的處理器沒(méi)有,只能用整型運(yùn)算模擬,這稱(chēng)為浮點(diǎn)運(yùn)算的軟件實(shí)現(xiàn)。

C 語(yǔ)言定義了這么多的數(shù)據(jù)類(lèi)型,我們?cè)?C 語(yǔ)言編程時(shí)應(yīng)選擇合適的數(shù)據(jù)類(lèi)型。例如某個(gè)變量的變化范圍是 0~100,那選擇 char 類(lèi)型就足夠了(無(wú)論有沒(méi)有符號(hào)),選擇 long 類(lèi)型會(huì)導(dǎo)致性能下降,原因我們?cè)谥暗奈恼吕镆呀?jīng)解釋過(guò)了。如果某個(gè)變量的變化范圍可能超過(guò) 255,那就不能選擇 char 類(lèi)型了,否則會(huì)造成數(shù)據(jù)溢出,例如

unsigned char i = 255; i = i + 2; printf("i=%d\n", i);

以上代碼會(huì)輸出“i=1”。

C 語(yǔ)言的數(shù)據(jù)類(lèi)型轉(zhuǎn)換

C 語(yǔ)言中的基本運(yùn)算,如+-* /%這些算術(shù)運(yùn)算以及> < >= <= == !=這些比較運(yùn)算,都需要兩邊的數(shù)據(jù)類(lèi)型一致,如果不一致,會(huì)自動(dòng)轉(zhuǎn)換為一致的類(lèi)型。例如:

unsigned char a = 254, b = 3; int sum = a+b;

計(jì)算 sum 之前,會(huì)先把 a 和 b 提升為 int 類(lèi)型再相加。

C語(yǔ)言的數(shù)據(jù)類(lèi)型自動(dòng)轉(zhuǎn)換,一般都是轉(zhuǎn)為占用字節(jié)數(shù)較多的類(lèi)型,如果有浮點(diǎn)型,則優(yōu)先轉(zhuǎn)為浮點(diǎn)型。例如,如果有一邊的類(lèi)型為 long double,則把另一邊也轉(zhuǎn)為 long double;否則,如果有一邊為 double 類(lèi)型,則把另一邊也轉(zhuǎn)為 double 類(lèi)型;否則,如果有一邊為 float,則把另一邊也轉(zhuǎn)為 float 類(lèi)型;。。。接著就是整型了,也是依次按照 long long -> long -> int -> short -> char 的順序轉(zhuǎn)換類(lèi)型的。

C 語(yǔ)言在賦值時(shí),也會(huì)做自動(dòng)的類(lèi)型轉(zhuǎn)換,例如:

int i = 3.14; printf("i=%d\n", i);

以上代碼會(huì)輸出 “i=3”,i 只保留的 3.14 的整數(shù)部分。

C 語(yǔ)言還有強(qiáng)制類(lèi)型轉(zhuǎn)換,只需要在要轉(zhuǎn)換的數(shù)據(jù)前加上 (要轉(zhuǎn)換的類(lèi)型),例如:

int i = 257; unsigned char j = (unsigned char)i; printf("j=%d\n", j);

以上代碼會(huì)輸出“j=1”,溢出的部分被忽略了。

初學(xué)者看到這些規(guī)則通常會(huì)很不舒服,覺(jué)得這不是在學(xué)編程而是在啃法律條文,結(jié)果越學(xué)越泄氣。是的,C語(yǔ)言并不像一個(gè)數(shù)學(xué)定理那樣,現(xiàn)實(shí)世界里的東西總是不夠的。但還好啦,C程序員已經(jīng)很幸福了,只要嚴(yán)格遵照C標(biāo)準(zhǔn)來(lái)寫(xiě)代碼,不要去觸碰那些陰暗角落,寫(xiě)出來(lái)的代碼就有很好的可移植性。想想那些可憐的JavaScript程序員吧,他們甚至連一個(gè)可以遵照的標(biāo)準(zhǔn)都沒(méi)有,一個(gè)瀏覽器一個(gè)樣,因而不得不為每一種瀏覽器的每一個(gè)版本分別寫(xiě)不同的代碼。

歡迎在評(píng)論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天淺顯的介紹C語(yǔ)言,喜歡我的文章就關(guān)注一波吧,可以看到新更新和之前的文章哦。本文部分參考 linux C編程一站式學(xué)習(xí)。

拓展知識(shí):c語(yǔ)言 整形占多少個(gè)字節(jié)

還有其他疑惑?想了解更多?可以點(diǎn)擊 【在線(xiàn)咨詢(xún)】