資料型態


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

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


以上的資料型態在記憶體中所佔有的大小依平台系統而有所差異,word的大小取決於機器,在32位元機器上通常一個word是4個位元組,如果想要知道這 些資 料型態在您所使用的平台上,所佔有的記憶體空間有多少,最好的作法是使用sizeof()運算子,它可以告訴您確實的記憶體大小,下面這個程式是個簡單的 示範:

#include <iostream>
using namespace std;

int main() {
cout << "\n型態\t大小(bytes)";
cout << "\nint\t" << sizeof(int);
cout << "\nlong\t" << sizeof(long);
cout << "\nfloat\t" << sizeof(float);
cout << "\ndouble\t" << sizeof(double);
cout << "\nchar\t" << sizeof(char);
cout << "\n";

return 0;
}

其中'\t'是跳格字元,它相當於在主控台中按下Tab鍵的效果,可以用來對齊下一個顯示位置;以下是執行結果:
型態     大小(bytes)
int         4
long      4
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的正整數。

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

C++中還有bool型別,用來表示布林數,在程式中佔一個位元組,可以使用true或false 字面常量(Literal constant)  來表示,實際上的數值則分別對應於1與0,可以使用下面這個程式來印證:

#include <iostream>
using namespace std;

int main() {
cout << "sizeof(bool)\t" << sizeof(bool) << "\n";
cout << "sizeof(true)\t" << sizeof(true) << "\n";
cout << "sizeof(false)\t" << sizeof(false) << "\n";

cout << "true\t" << static_cast<int>(true) << "\n";
cout << "false\t" << static_cast<int>(false) << "\n";

system("PAUSE");
return 0;
}

執行結果:
sizeof(bool)    1
sizeof(true)     1
sizeof(false)    1
true    1
false   0

在程式當中使用到static_cast,這是顯式型態轉換(Explicit type conversion),將bool型態轉型(Cast)為int型態,您可以在 算術運算、型態轉換 中看到型態轉換的相關說明。