原回答用「箱子」比喻很直觀:int 是小箱子裝整數,float 是中箱子裝單精度浮點,double 是大箱子裝雙精度浮點。但實務選型需理解底層儲存標準(IEEE 754)與效能權衡。
| 型別 | 典型大小 | 範圍(32/64 位系統常見) | 適用場景 |
|---|---|---|---|
char | 1 byte | -128 ~ 127 / 0 ~ 255 | 字元、極小整數、位元操作 |
short | 2 bytes | -32,768 ~ 32,767 | 省記憶體的小整數 |
int | 4 bytes | -2,147,483,648 ~ 2,147,483,647 | 預設整數型別,迴圈計數、一般運算 |
long | 4/8 bytes | 視平台而定 | 需更大範圍時,配合 L 後綴 |
long long | 8 bytes | -9.22e18 ~ 9.22e18 | 大整數、時間戳、ID 生成 |
int32_t 等 | 固定寬度 | 精確 32/64 位 | 跨平台、網路協議、二進位格式(<stdint.h>) |
最佳實務:除非有特定需求(省記憶體、固定寬度、極大數),優先使用 int。現代 CPU 對 32 位整數運算最優化。
| 型別 | 大小 | 有效位數(十進位) | 指數範圍 | 適用場景 |
|---|---|---|---|---|
float | 4 bytes | ~6-7 位 | ±1.18e-38 ~ ±3.40e38 | 顯示座標、單精度科學計算、GPU 著色器、大量資料省記憶體 |
double | 8 bytes | ~15-16 位 | ±2.23e-308 ~ ±1.80e308 | 預設浮點型別,金融計算、科學工程、一般精度需求 |
long double | 10/16 bytes | ~18-33 位 | 更大 | 極高精度需求、數值分析、編譯器支援不一 |
float f = 0.1f; // 實際儲存:0.10000000149011612
double d = 0.1; // 實際儲存:0.10000000000000000555
printf("%.20f\n", f); // 0.10000000149011611938
printf("%.20f\n", d); // 0.10000000000000000555
結論:0.1 在二進位無法精確表示(循環小數),float 誤差更大。金融/貨幣計算嚴禁用浮點數,應用整數存「分」或定點數/十進位浮點庫。
int(預設)→ 需更大範圍 → long long → 需固定寬度 → int32_t/int64_t。double(預設)→ 記憶體極度受限/大量陣列 → float → 極高精度 → long double 或專用庫。decimal 庫。uint8_t, uint32_t 等無號固定寬度型別。float 比 double 快」。現代 x86-64 CPU 浮點單元內部以 80 位運算,double 往往不慢甚至更快;ARM NEON/SIMD 則對 float 向量化更優。以正確性優先,效能再實測。int 永遠 4 位元組」。C 標準只保證 short ≤ int ≤ long,嵌入式平台 int 可能 2 位元組。跨平台代碼用 <stdint.h> 固定寬度型別。float f = 1.23; 無後綴,1.23 是 double 常數,會隱含轉換並可能產生警告。寫 1.23f。理解型別的「箱子大小」只是入門。專業開發者需掌握:儲存標準(IEEE 754/二進位補數)、對齊要求、轉換規則、未定義行為邊界、平台差異。選型原則:正確性 > 可讀性 > 效能,預設用 int 和 double,特定場景再精準選型。