謝邀。
C語(yǔ)言將數(shù)據(jù)劃分為不同的數(shù)據(jù)類型,是為了在保持較小開銷的情況下,盡量精確的記錄和計(jì)算數(shù)據(jù)。要知道,C語(yǔ)言程序的宗旨就是“小開銷,高效率”。解決問題時(shí),選擇合適的數(shù)據(jù)類型,能夠大大提升程序最終的效率。
題主應(yīng)該是想問C語(yǔ)言有哪些“基礎(chǔ)”數(shù)據(jù)類型吧?畢竟C語(yǔ)言是支持結(jié)構(gòu)體語(yǔ)法的,它允許我們自定義各種數(shù)據(jù)類型。
下面談?wù)凜語(yǔ)言中的基礎(chǔ)數(shù)據(jù)類型。
整型
計(jì)算機(jī)存儲(chǔ)的最小單位是字節(jié)(Byte),一個(gè)字節(jié)通常是8個(gè)bit。我們常說的硬盤容量500GB,就是指硬盤能夠存儲(chǔ)500G字節(jié)的數(shù)據(jù)。
C語(yǔ)言規(guī)定char型占一個(gè)字節(jié)的存儲(chǔ)空間,如果是unsignedchar(無符號(hào)),則可表示的取值范圍是0~255。如果是signedchar(有符號(hào)),則取值范圍為-128~127。
定義char型變量時(shí)不指定unsigned或signed,C語(yǔ)言標(biāo)準(zhǔn)規(guī)定這種情況屬于implementiondefined,具體char型變量是否有符號(hào)取決于使用的編譯器。C語(yǔ)言標(biāo)準(zhǔn)的原則是:優(yōu)先考慮效率,可移植性其次。
所以如果在對(duì)應(yīng)的體系架構(gòu)上,char型變量有符號(hào)時(shí)效率最高,則編譯器就將其解釋為有符號(hào)。若char型變量無符號(hào)時(shí)效率最高,則編譯器就將其解釋為無符號(hào)。
應(yīng)該沒有人故意寫出沒有移植性的代碼,所以建議寫C語(yǔ)言代碼用到char型變量時(shí),顯性的指出其是否有符號(hào)。
另外,整型數(shù)據(jù)類型還有shortint(可簡(jiǎn)寫為short),int,longint(可簡(jiǎn)寫為long),longlongint(可簡(jiǎn)寫為longlong)幾種,這些類型也可以加上unsigned或signed表示無符號(hào)型或有符號(hào)型。
上面幾種整數(shù)類型與char類型的區(qū)別主要在于占用的存儲(chǔ)空間不同,但是究竟這幾種整型類型占幾個(gè)字節(jié),C語(yǔ)言標(biāo)準(zhǔn)沒有規(guī)定,所以在不同架構(gòu)的計(jì)算機(jī)中,這幾種類型占用的空間可能不同。
例如在
除了char,其他幾種整型類型如果定義時(shí)沒有寫符號(hào),則默認(rèn)為是有符號(hào)的。
浮點(diǎn)型
C語(yǔ)言標(biāo)準(zhǔn)規(guī)定的浮點(diǎn)型有float,double,longdouble,但是對(duì)每種數(shù)據(jù)類型占用的存儲(chǔ)空間卻沒有規(guī)定。
浮點(diǎn)型的實(shí)現(xiàn)在不同的平臺(tái)上的差異性比整型更大。有的處理器自帶的有浮點(diǎn)運(yùn)算單元,稱為浮點(diǎn)運(yùn)算的硬件實(shí)現(xiàn)。有的處理器沒有,只能用整型運(yùn)算模擬,這稱為浮點(diǎn)運(yùn)算的軟件實(shí)現(xiàn)。
我們?cè)贑語(yǔ)言編程時(shí)應(yīng)選擇最合適的數(shù)據(jù)類型。例如某個(gè)變量的變化范圍是0~100,那選擇char類型就足夠了(無論有沒有符號(hào)),選擇long類型會(huì)導(dǎo)致性能下降,原因在我之前的文章里已經(jīng)解釋過。如果某個(gè)變量的變化范圍可能超過255,那就不能選擇char類型了,否則會(huì)造成數(shù)據(jù)溢出,例如
編譯并執(zhí)行這段C語(yǔ)言代碼,會(huì)得到輸出:i=1。C語(yǔ)言程序中的數(shù)據(jù)溢出,可以借助計(jì)算器直觀的看出,請(qǐng)看下圖:
C語(yǔ)言的數(shù)據(jù)類型轉(zhuǎn)換
C語(yǔ)言中的基本運(yùn)算,如+-*/%這些算術(shù)運(yùn)算以及><>=<===!=這些比較運(yùn)算,都需要兩邊的數(shù)據(jù)類型一致,如果不一致,會(huì)自動(dòng)轉(zhuǎn)換為一致的類型。例如:
計(jì)算sum之前,程序會(huì)先把a(bǔ)和b提升為int類型(即所謂的“整形提升”)再相加。
C語(yǔ)言的數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換,
例如,如果有一邊的類型為longdouble,則把另一邊也轉(zhuǎn)為longdouble;
否則,如果有一邊為double類型,則把另一邊也轉(zhuǎn)為double類型;
否則,如果有一邊為float,則把另一邊也轉(zhuǎn)為float類型;
。。。接著就是整型了,也是依次按照l(shuí)onglong->long->int->short->char的順序轉(zhuǎn)換類型的。
C語(yǔ)言在賦值時(shí),也會(huì)做自動(dòng)的類型轉(zhuǎn)換,例如:
以上代碼會(huì)輸出“i=3”,i只保留的3.14的整數(shù)部分。C語(yǔ)言還有強(qiáng)制類型轉(zhuǎn)換語(yǔ)法,只需要在要轉(zhuǎn)換的數(shù)據(jù)前加上(要轉(zhuǎn)換的類型),例如:
以上代碼會(huì)輸出“j=1”,溢出的部分被忽略了。
很多C語(yǔ)言初學(xué)者看到這些規(guī)則通常會(huì)很不舒服,覺得這不是在學(xué)編程而是在啃法律條文,結(jié)果越學(xué)越泄氣。
是的,C語(yǔ)言并不像一個(gè)數(shù)學(xué)定理那樣完美,現(xiàn)實(shí)世界里的東西總是不夠完美的。但還好啦,C語(yǔ)言程序員已經(jīng)很幸福了,只要嚴(yán)格遵照C標(biāo)準(zhǔn)來寫代碼,不要去觸碰那些陰暗角落,寫出來的代碼就有很好的可移植性。
想想那些可憐的JavaScript程序員吧,他們甚至連一個(gè)可以遵照的標(biāo)準(zhǔn)都沒有,一個(gè)瀏覽器一個(gè)樣,因而不得不為每一種瀏覽器的每一個(gè)版本分別寫不同的代碼。
歡迎在評(píng)論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語(yǔ)言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。