數據類型是C語言程序設計的基石。本文系統梳理整數、浮點數、邏輯類型的存儲機制、範圍、輸出格式及選擇原則,並深入探討補碼表示與浮點數精度陷阱。
| 類型 | 說明 | 典型大小 |
|---|---|---|
char | 字符型/最小整型 | 1字節 (8位) |
short | 短整型 | 2字節 (16位) |
int | 基本整型 | 取決於編譯器/CPU位數 |
long | 長整型 | 取決於編譯器/CPU位數 |
核心洞見:int 的大小通常等於CPU寄存器位寬(32位機為4字節,64位機常為4或8字節),這是為了讓CPU最高效地處理數據。可用 sizeof(int) 確認具體大小。
計算機以補碼形式存儲有符號整數:
例如 8位 char:00000001 表示 1,11111111 表示 -1。範圍為 -128 ~ 127。
無符號類型(unsigned)無符號位,範圍為 0 ~ 255(8位)。其設計初衷是為了支持位移操作,避免符號位干擾。
printf 通過格式控制符輸出:
%d / %i:有符號十進制整數%u:無符號十進制整數%x / %X:十六進制%o:八進制現代32/64位系統中,無特殊需求首選 int。使用 char/short 不一定節省空間(因內存對齊),反而可能因轉換開銷降低性能。這也是C語言可移植性較差的原因之一(Java固定 int 為4字節)。
| 類型 | 位數 | 範圍 | 有效位數 |
|---|---|---|---|
float | 32位 | ±1.2E-38 ~ ±3.4E+38 | 6~7位 |
double | 64位 | ±2.2E-308 ~ ±1.79E+308 | 15~16位 |
long double | 通常80/128位 | 更大 | 18~19位 |
== 比較:應用 fabs(a-b) < EPSILON(如 1e-12)判斷近似相等。bool,C99引入 <stdbool.h> 提供 bool, true, false(本質仍是整型)。| 運算符 | 名稱 | 說明 |
|---|---|---|
! | 邏輯非 | 0→1,非0→0 |
&& | 邏輯與 | 短路求值:左側為假則不算右側 |
|| | 邏輯或 | 短路求值:左側為真則不算右側 |
& | 按位與 | 逐位運算,不短路 |
| | 按位或 | 逐位運算,不短路 |
單目運算符(!)優先級高於雙目運算符。!age < 20 等價於 (!age) < 20,而非 !(age < 20)。
理解數據類型的存儲本質(補碼、IEEE 754)、範圍邊界、輸出格式及隱式轉換規則,是編寫高效、可移植、無Bug C代碼的前提。選擇類型時,以 int 為主,按需使用 long long/double/unsigned,謹記浮點數比較需容差。