2.3 整數資料型態
¶整數型態的差別:位元數與範圍
不同整數型態佔用的位元數不同,導致能表示的數值範圍不同。
¶常見整數型態
| 型態 | 位元數 | 位元組 | 範圍 |
|---|---|---|---|
short |
16 | 2 | -32,768 ~ 32,767 |
int |
32 | 4 | -2,147,483,648 ~ 2,147,483,647 |
long long |
64 | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
¶還有一個尷尬的存在:long
上面的表只列了三種,但 C++ 其實還有一個整數型態叫 long,大小剛好介於 int 和 long long 之間。我們特別把它獨立出來提醒,是因為它對競程選手來說是個尷尬的存在——尷尬在於:它到底是 32 位元還是 64 位元,C++ 沒有規定死,要看你的作業系統和編譯器。
| 型態 | 位元數 | 隨平台而變 |
|---|---|---|
long |
32 或 64 | 64 位元 Linux(競程常見)通常是 64;Windows 往往只有 32 |
也就是說,同一行 long x = 3000000000;(30 億,超出 int),在 Linux 上跑得好好的,搬到 Windows 上就可能溢位出錯。這種「換個環境就變臉」的個性,讓 long 變成一個你最好認得、但平常別碰的型態:需要比 int 更大的範圍時,一律用保證 64 位元的 long long,心裡才有底。
¶補充:signed 與 unsigned
整數型態預設是 signed(有符號,可以存負數)。其實還有 unsigned(無符號,只能存 0 和正數,範圍往正向多一倍)。不過競程幾乎用不到 unsigned——直接用預設的 int、long long 就好,這裡先知道有這個東西即可。
¶動手試試看:用現成常數印出範圍
表格裡那些位數很多的確切數字,你不用去背、也不用在程式裡自己打——C++ 在 <climits> 這個標頭檔裡,已經幫每種整數型態準備好「最大值/最小值」的現成名字,要用直接叫出來就好:
| 常數 | 意思 |
|---|---|
INT_MAX / INT_MIN |
int 的最大值 / 最小值 |
LLONG_MAX / LLONG_MIN |
long long 的最大值 / 最小值 |
試著執行以下程式,印出你系統上這些範圍(記得開頭要 #include <climits> 才能用這些名字):
#include <iostream>
#include <climits>
using namespace std;
int main() {
cout << "int max: " << INT_MAX << endl;
cout << "int min: " << INT_MIN << endl;
cout << "long long max: " << LLONG_MAX << endl;
cout << "long long min: " << LLONG_MIN << endl;
return 0;
}
執行結果(典型):
int max: 2147483647
int min: -2147483648
long long max: 9223372036854775807
long long min: -9223372036854775808