上次我總結到C語言的詞法符號時提及過C語言的32個關鍵字,但並未詳細介紹過現在我就來詳細的介紹下32個關鍵字的一部分。在介紹關鍵詞之前我們要明確這32個關鍵詞在C語言中的地位,可以這樣形容吧,這32個關鍵詞就像我們在學習英語時的26個字母一樣,它是構成C語言這一語言體系的基本元素。那麼熟練的掌握它就很有必要了。今天我就詳細的介紹下32個關鍵詞中的第一大類中的前兩類(共9個關鍵字),他們是:基本數據類型(void、char、int、float、double)、修飾類型(short、long、signed、unsigned)。
首先我們還是整體的瞭解下C語言中常見的數據類型:
這裏有一點爭議需要指出的是在譚浩強老師的C語言書中將枚舉類型列爲基本類型,而在陳正衝老師的《C語言深度解剖》中將枚舉類型列爲構造類型。在這裏我還是贊成譚浩強老師的分類,等下說到枚舉類型我將解釋原因。
這裏先看看基本數據類型。
基本數據類型:基本類型是C語言程序設計的最小單元,又被稱爲原子數據類型,其它的複雜數據類型都可以由基本數據類型進行構造。
一、整型數據家族:
整型數據類型最基本的關鍵詞是:int 。它能被另外的4種修飾類型的關鍵字所修飾因此一共可以組成6中類型的整型:
類型 | 字節數(byte) | 比特數(bit) | 取值範圍 |
[signed] int | 4 | 32 | 2147483648~2147483647 |
unsigned int | 4 | 32 | 0~4294967295 |
[signed] short [int] | 2 | 16 | 32768~32767 |
unsigned short [int] | 2 | 16 | 0~65535 |
long [int] | 4 | 32 | 2147483648~2147483647 |
unsigned long [int] | 4 | 32 | 0~4294967295 |
說明:上表中的[]內的關鍵字可以省略;
爲了表明我上表中每種整型數據類型的正確性,我將在下面做一個很簡單的小實驗,其中要接用關鍵字sizeof,這裏又要着重的說明下:sizeof不是函數名,更不能把sizeof()看成是一個函數,它的作用是等到特定類型或特定類型變量所佔字節的大小。
其結果如下:
這裏需要指出的是不同的計算機的體系結構中這些類型在內存中所佔的字節數有可能不同。若想查看當前機器的各數據類型所佔的字節數(取值範圍),可以查看文件"limits.h"(通常在編譯器相關的目錄下:/usr/include/limits.h),如下所示:
還有點小的技巧需要指出:
在嵌入式開發中,經常需要考慮的一點就是可移植性的問題。通常把存儲於int型的變量的值限制於signed int和unsigned int的交集中,這樣可以獲得最大的可移植性又不犧牲效率。
整型常量可以八進制、十進制、十六進制3中表示方式表示。
1.1、十進制 :用0~9 十個數表示,滿十進一;
十進制數是日常生活中使用最廣的計數制。組成十進制數的符號有0,1,2,3,4,5,6,7,8,9等共十個數碼。
在十進制中,每一位有0~9共十個數碼,所以計數的基數爲10。超過9就必須用多位數來表示。
十進制數的運算遵循:加法時:“逢十進一”;減法時:“借一當十”。
十進制數中,數碼的位置不同,所表示的值就不相同(與位權有關)。
每個對應的數碼有一個係數1000,100,10,1與之相對應,這個係數就叫做權或位權。十進制數的位權一般表示爲:10n - 110爲十進制的進位基數;10的i次爲第i位的權;n表示相對於小數點的位置,取整數;當n位於小數點的左邊時,依次取n=1、2、3……n。位於小數點的右邊時,依次取n=-1、-2、-3……因此,634.27可以寫爲:634.27=6×102+3×101+4×100+2×10^-1+7×10^-2;在正常書寫時,各數碼的位權隱含在數位之中,即個位、十位、百位等。
1.2、二進制 :
二進制計算法的特點:
①二進制數只有“0”和“1”兩個數碼,基數是2,最大的數字是1;
②採用逢二進一的原則。
二進制的位權一般表示爲:2^n-1。各位的權爲以2爲底的冪。例如,(01101010)各位的權自至在依次爲2^7、2^6、2^5、2^4、2^3、2^2、2^1、2^0。
二進制數的算術四則運算規則,除進、借位外與十進制數相同。
■二進制加法規則
0+0=0 1+0=1
0+1=1 1+1=10(紅色爲進位位)
■二進制減法規則
0-0=0 0-1=1-借位
1-0=1 1-1=0
■二進制乘法規則
0×0=0 1×0=0
0×1=0 1×1=1
爲了區別於十進制數,在書寫時二進制數可以用兩種方法表示:例如:(1011.01)2或1011.1B。
例如:寫出(1011.01)2的十進制數表達式。
(1011.01)2=1×23+0×22+1×21+1×20+0×2-1+1×2-2=(11.25)10
二進制的優點是:
■二進制只有“0”和“1”兩數字,很容易表示。電壓的高和低、 晶體管的截止與飽和、磁性材料的磁化方向等都可以表示爲“0”和“1”兩種狀態。
■二進制數的每一位只有0和1兩狀態,只需要兩種設備就能表示, 所以二進制數節省設備。由於狀態簡單,所以抗干擾力強,可靠性高。
二進制的主要缺點是:
數位太長,不便閱讀和書寫,人們也不習慣。爲此常用八進制和十六進制作爲二進制的縮寫方式。爲了適應人們的習慣,通常在計算機內都採用二進制數,輸入和輸出採用十進制數,由計算機自己完成二進制與十進制之間的相互轉換。
應用 : 1、用於電子計算機信息處理
2、編碼;
注:在C語言中一般不用二進制數表示;
3、八進制 :用0 ~ 8 八個數表示,滿8進一;
注:八進制以0作爲前導;
有八個不同的計算符號0、1、2、3、4、5、6、7,這八個符號稱爲數碼。
採用逢八進一的原則。對應於十進制數0、1、2、3、4、5、6、7、8,八進制數分別記作0、1、2、3、4、5、6、7、8、10。
4、十六進制 : 以0 ~ 9 ,a(A), b(B), c(C) , d(D), e(E), f(F)十六個數碼錶示,滿十六進一;
注:十六進制數以0x/X做前導;
二進制數在計算機系統中處理很方便,但當位數較多時,比較難記憶及書寫,爲了減小位數,通常將二進制數用十六進制表示。
十六進制是計算機系統中除二進制數之外使用較多的進制。
十六進制數的位權一般表示爲:16^n-1。其中16是十六進制的進位基數,n表示相對小數點的位置。在書寫時,用加註16或H的方式表示十六進制數,例如:(8FA.5)16或8FA.5H。例如:寫出(8FA.5)16的十進制數表達式。
(8FA.5)16=8×162+15×161+10×160+5×16-1=(2298.3125)10
進制間的相互轉換應該結合:1、三位二進制數可以轉換成一位八進制數;2、四位二進制數可以轉換成一位十六進制數;
詳細如何進行轉換在這裏我就不詳敘。
二、實型家族:
所謂實型也就是常說的浮點型,其基本類型的關鍵字有:float、double;修飾的關鍵字只有:long一個,一共組成3種實型:
類型 | 比特數 | 有效數字 | 取值範圍 |
float(單精度) | 32 | 6~7 | 3.4×10^38~3.4×10^38 |
double(雙精度) | 64 | 15~16 | 1.7×10^308~1.7×10^308 |
long double | 64 | 18~19 | 1.2×10^308~1.2×10^308 |
這裏我就不再累贅的去敘序它們之所以佔的字節數了。
如果你觀察仔細你一定會有這種質疑:爲什麼float與int類型中的衆多類型所佔的字節數是相同的,但它們的取值範圍爲什麼不一樣呢?
呵呵,如果有這個疑問就說明你還沒徹底的瞭解數據在計算機內存中的存儲方式了。
其實它們的取值範圍不同是由於在內存中的存儲方式不同造成的。
對於整型類型的數據:
如果是無符號的整型數據則在內存中是以原碼的形式儲存的,不存在符號位,如果該機器位整型數據分配4個字節則最大可表示爲:(二進制形式)1111 1111 1111 1111 1111 1111 1111 1111,其十進制表示爲:4294967295 ;最小的當然是全零了,即爲零。所以int類型的數據的取值範圍就爲:0~ 4294967295。其它的無符號整型依次類推即可得到其取值範圍。
如果是有符號類型的整型數據,則在內存中以補碼的形式存儲。在每個內存單元的最高位(最左邊的那一位)用於存儲符號位:其中若爲正,則符號位是:0;若爲負,則最高位的符號位爲:0。爲了簡化理解過程和敘述簡單起見我們可以這樣理解,在有符號類型的int類型數據的有效位只有31bit,則其能表示的最大二進制數位:111 1111 1111 1111 1111 1111 1111 1111;其十進制數表示爲:2147483647。當符號位爲:0時,則表示最大十進制數爲:2147483647;當符號爲:1時,表示該整型數據爲負,當這裏有一點需要注意,計算機存儲的補碼:1000 0000 0000 0000 0000 0000 0000 0000計算機是默認其值:- 2^32 = 2147483648。如果有興趣可以想想這是爲什麼。所以signed int範圍爲:2147483648 ~ 2147483647。其它的有符號類型可以照此類推。
對於實型數據:
實型常量的表示:在C語言中實型常量只以十進制的計數法來表示。但其有兩種形式:
一種就是我們習慣用的十進制形式表示:由數碼0 ~ 9和小數點一起表示,如:0.;.25; 5.13;50;等;
另一種就是用指數形式表示:<尾數>E(或e)<整型指數>,如:.12E-2; -4.e10;6.7E23等;
實型數據在內存中的存儲形式:一律都用指數的形式存儲。
無論是單精度還是雙精度在存儲中都分爲三個部分:
1 符號位(Sign) : 0代表正,1代表爲負
2 指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移位存儲 指數部分也有符號位,故其取值範圍是-127~ 128
3 尾數部分(Mantissa):尾數部分(小數點後面的部分);
單精度浮點數:1位符號位,8位指數位,23位有效數字。
雙精度浮點數:1位符號位,11位指數位,52位有效數字。
計算規則:數字 = 有效數字*2^指數*符號
其中float的存儲方式如下圖所示:
而雙精度的存儲方式爲:
結合前面我提到過的推導方法和上圖我們不難推導出單精度和雙精度的表示範圍比整型的表示範圍更廣。
也有以下規律:
小數部分所佔的位數(bit)越多越,數的精度就越高;
指數部分所佔的位(bit)數越多,數據所表示的範圍越大;
三、字符型家族
字符型數據可以看成是特殊的整型數據(整型數據的一部分),可以這樣理解,字符型數據最終在計算機中是以字符對應的ASCII值來存放的,如果稍稍學過C語言的人應該知道ASCII值是整型數據吧。呵呵。。。不信的話我來亮亮證據:
我這裏還有個網址可以查看ASCII表:http://www.weste.net/tools/ASCII.asp
表示字符類型的關鍵字:char ;修飾的關鍵字:signed 、unsigned;
所以用只有兩種類型:
類型 | 字節數(byte) | 比特數(bit) | 取值範圍 |
(signed)char | 1 | 8 | -128 ~ 127 |
unsigned char | 1 | 8 | 0 ~ 255 |
這裏有一個經典的實例,可以對char的變量範圍進行理解:
其結果爲:
從這裏可以清楚的看出無符號的char類型數據的範圍了。
對於有符號的數據類型一樣的可以推導,這裏還是不墜敘了。
字符常量是指用單括號括起來的一個字符,如’a’、’D’、’+’、’?’等都是字符常量 。
五、空類型
定義空類型的關鍵字是:void,沒有修飾類型的關鍵字修飾它。
空類型是所有數據類型的基礎。不要故名思議的認爲空類型就是無數據類型,它本身就是一種數據結構,常用於數據的轉換和和參數的傳遞過程。
六、枚舉類型
在枚舉類型的定義中列舉出所有可能的取值,被定義爲該枚舉類型的變量取值不能超過定義的範圍。枚舉類型是一個基本數據類型的原因是因爲它不再可分解成任何基本類型。
七 C99標準擴展的基本數據類型:
1、bool類型 非零表示爲真、零表示爲假
注:a、在不支持C99的機器體系結構中C語言不支持bool類型,但可以自己定義:
typedef char bool;
#define TRUE 1
#define FALSE 0
藉助char的原因,因爲char類型的數據在內存中佔一個字節,所以可以做到內存更省;
b、在使用bool類型時一定要在頭文件中包含"stdbool.h"。
2、long long int 類型 在內存中佔64位,表示的範圍更加地廣,由int 範圍的推導,我們可以推導出其所表示的範圍
介紹到這裏相信你對C語言的基本數據類型有個全面的瞭解吧!^-^