5. C語言基本資料型別及構造資料型別,浮點型儲存規則及記憶體模型
其實學習C語言的時候有一件很頭疼的事就是各種各樣的資料型別,不同的場合不同的用途不同的資料要使用不同的資料型別,那又為什麼要分出這麼多種型別呢,因為型別決定了開闢空間的大小,開闢空間的大小又決定了儲存的範圍。今天,就資料型別這個問題我們來掰扯掰扯。
C語言的內建資料型別大體上可以分為兩類,整形家族與浮點數家族。
1. 整形家族
1.1 字元型別 char
為什麼要把一個裝字元的資料型別歸到整形家族中呢,因為在C語言的編碼集是ASCII碼,char型別儲存字元是儲存字元的ASCII值,在本質上來講也是儲存數字,所以char也屬於整形家族的一員。
定義:存放字元的資料型別
大小:1位元組
分類:
- char
- signed char
- unsigned char
char與signed char不一定一樣,具體char預設代表的是有符號還是無符號,由編譯器決定。
1.2 短整型 short
大小:2位元組
1.3 整型 int
大小:4位元組
2.4長整形 long
大小:4/8位元組
long型別在記憶體中佔幾個位元組與所使用的機器有關,在32位的機器上,long在記憶體中佔4位元組,而64位機器上,long佔8位元組。
2.5 long long
大小:4/8位元組
C語言規定中沒有明確long long 的具體長度,只是定義 long long的長度大於等於long即可,具體由編譯器決定。
2. 浮點數家族
整形家族在記憶體中是以二進位制補碼的形式儲存的,而浮點型卻是大相徑庭的。
根據國際標準IEEE(電⽓和電⼦⼯程協會) 754,任意⼀個⼆進位制浮點數V可以表示成下⾯的
形式:(-1)S * M * 2E(-1)
s表示符號位,當s=0, V為正數;當s=1, V為負數。M表示有效數字,⼤於等於1,⼩於2。
2E表示指數位。
舉例:
⼗進位制的5.0,寫成⼆進位制是 101.0 ,相當於 1.01×2^2。
那麼,按照上⾯V的格式,可以得出s=0, M=1.01, E=2。
⼗進位制的-5.0,寫成⼆進位制是 -101.0 ,相當於 -1.01×2^2。
那麼, s=1, M=1.01, E=2。
2.1 單精度浮點型 float
大小:4位元組
IEEE 754規定: 對於32位的浮點數,最⾼的1位是符號位s,接著的8位是指數E,剩下的23
位為有效數字M。
2.2 雙精度浮點型 double
大小:8位元組
對於64位的浮點數,最⾼的1位是符號位S,接著的11位是指數E,剩下的52位為有效數字M。
long double
大小與long long 一樣,長度比long長即可,具體由編譯器決定
雖然C語言給我們提供了這麼多的內建型別,但是在實際工程中,單單這些內建型別是遠遠不夠的,所以又有了構造型別這一概念。
3. 構造型別
我們把構造型別分為如下幾種
- 陣列型別
- 結構體型別 struct
- 列舉型別 enum
- 聯合(共用體)型別 union
//成員共用一片儲存空間,同一時間只能使用其中一個成員
union Un
{
char c;
int i;
};
int main()
{
union Un u;
printf("%d\n",sizeof(u)); //4
return 0;
}