BASIC 等語言可任意指派數值型別給變數,翻譯器自動分配空間。C++ **必須先宣告型別再使用**,編譯器進行型別檢查確保執行順利。型別使用不當導致編譯錯誤或警告,便於分析修正。
部分型別有帶號/無號之分:帶號含正負數,無號僅含正數。
| 資料型別 | 位元組數 | 取值範圍 |
|---|---|---|
| char | 1 | -128 ~ 127 |
| unsigned char | 1 | 0 ~ 255 |
| short | 2 | -32,768 ~ 32,767 |
| unsigned short | 2 | 0 ~ 65,535 |
| long | 4 | -2,147,483,648 ~ 2,147,483,647 |
| unsigned long | 4 | 0 ~ 4,294,967,295 |
| int | 4 | 同 long |
| unsigned int | 4 | 同 unsigned long |
| float | 4 | 1.2E-38 ~ 3.4E+38 |
| double | 8 | 2.2E-308 ~ 1.8E+308 |
| bool | 1 | true 或 false |
遺留問題。16 位元環境 int 2 位元組、long 4 位元組。32 位元環境(C++ Builder 僅產生 32 位元程式)兩者皆 4 位元組。
C++ Builder 和 Borland C++ 5.0 中 bool 是真正資料型別。某些編譯器 bool 只是 typedef int bool(建立別名)。
其他型別僅涉及整數。指定帶小數點數值給整數型別會**捨棄小數部分**(非四捨五入):int x = 3.75; // x = 3。Windows 程式鮮少用浮點數。
C++ 可在必要時進行型別轉換:
short result;
long num1 = 200, num2 = 200;
result = num1 * num2; // 混用型別,C++ 自動轉換
結果驚人:**25536**(非 40000)。這是繞接:short 最大 32767,超過則從 -32768 繼續。如汽車里程表 99999 歸零。
#include
#include
#pragma hdrstop
int main(int argc, char** argv) {
short x = 32767;
cout << "x = " << x << endl;
x++;
cout << "x = " << x << endl; // 輸出 -32768
getch();
return 0;
}
用 int 無此問題(範圍 ±20 億),但佔 4 位元組(short 2 位元組)。大多數應用差異不明顯。
無法轉換時產生編譯錯誤 Cannot convert from x to y;可能精度損失時警告 Conversion might lose significant digits。**警告應視同錯誤**,努力達到零警告編譯。無法避免的警告必須徹底理解並盡力修正。