1. 程式人生 > >5. C語言基本資料型別及構造資料型別,浮點型儲存規則及記憶體模型

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;
    }