From Gossip@caterpillar

C Gossip: 資料型態(Data type)

程式在執行的過程中,需要運算許多的資訊,也需要儲存許多的資訊,資訊是儲存在記憶體空間中,由於資料的型態各不相同,在儲存時所需要的容量不一,不同的資料必須要配給不同的空間大小來儲存,因而有了「資料型態」(Data type)的規範。

C中基本的資料型態主要區分為「整數」(Integer)、「浮點數」(Float)、「字元」(Character),而這幾種還可以細分,如下所示:
  • 整數
用來表示整數值,可以區分為short、int、與long,所配置的記憶體長度在不同的編譯器上各不相同,可容納的大小各不相同,在Dev C++的編譯器下,short為2位元組、int與long為4位元組,型態的長度越長,表示可表示的整數值範圍越大。
  • 浮點數
用來表示小數值,可以區分為float、double與long double,在Dev C++編譯器上,float的長度為一個4個位元組,double的長度為8個word,long double長度為12個word。
  • 字元
用來儲存字元,長度為1個位元組,其字元編碼主要依ASCII表而來,由於字元在記憶體中所佔有的空間較小,所以它也可以用來儲存較小範圍的整數。

以上的資料型態在記憶體中所佔有的大小依編譯器而有所差異,如果想要知道這些資料型態在您所使用的平台上,所佔有的記憶體空間有多少,最好的作法是使用sizeof()運算子,它可以告訴您確實的記憶體大小,下面這個程式是個簡單的示範:
#include <stdio.h>
#include <stdlib.h>

int main(void) {
printf("型態\t\t大小(bytes)\n");
printf("short\t\t%d\n", sizeof(short));
printf("int\t\t%d\n", sizeof(int));
printf("long\t\t%d\n", sizeof(long));
printf("float\t\t%d\n", sizeof(float));
printf("double\t\t%d\n", sizeof(double));
printf("long double\t%d\n", sizeof(long double));
printf("char\t\t%d\n", sizeof(char));
return 0;
}

其中'\t'是跳格字元,它相當於在主控台中按下Tab鍵的效果,可以用來對齊下一個顯示位置,%d為格式指定碼,表示該位置將放置一個整數數字,即由 sizeof(() 所計算出來的數字取代,在 終端機輸出輸入(Input/Output)中,將針對格式控制作進一步說明。

以下是執行結果:
型態            大小(bytes)
short           2
int             4
long            4
float           4
double          8
long double     12
char            1

float           4
double          8
char            1

由於使用的平台不同,您的結果不一定會與這邊的結果相同;因為每種資料型態所佔有的記憶體大小不同,因而可以儲存 的數值範圍也就不同,例如在上例中,整數 int的記憶體空間是4個位元組,所以它可以儲存的整數範圍為-2147483648至2147483647,如果儲存值超出這個範圍的話稱之為「溢值」 (Overflow),會造成程式不可預期的結果。

整數計算範圍的方式很簡單,例如int整數佔4位元組的話,可儲存範圍為2^32 / 2,除以2是因為要分另一半儲存負整數的關係,整數的最左邊位元被用來表示正負號,如果最左邊位元為0表示正號,若為1則表示負號,在C中還可以宣告 無正負號整數,此時最左邊位元不用來表示正負號,例如一個8位元字元被用來表示整數時,可以表示數值-128到127,而一個無正負號字元則可以表示0到 255的正整數。宣告無號整數的方式,在 變數(Variable)中會有說明。

浮點數的儲存方式則是分為兩個部份,例如float佔四個位元組的話,前三個位元組是用來儲存假數,後一個位元組儲存指數,例如3.14*10^8, 3.14儲存在前三位元組,而8儲存於後一位元組,所以float大致上可以儲存的範圍為10^38到10^-38(就指數來算出的),而double則 可以大致儲存10^308至10^-308之間的數值。