章節核心內容
第 3 章深入探討 C 語言數據在內存中的表示方式、基本類型細節、類型轉換規則及結構體/聯合體對齊機制。
1. 整數表示
- 補碼表示有符號整數:最高位為符號位,負數 = 反碼 + 1
INT_MIN = -2^(N-1),INT_MAX = 2^(N-1)-1(N 為值位數)
- 無符號類型範圍:0 到 2^N-1
- 溢出行為:無符號按模 2^N 環繞;有符號溢出是未定義行為(UB)
2. 浮點數(IEEE 754)
float:1 符號位 + 8 指數位 + 23 尾數位(單精度)
double:1 + 11 + 52(雙精度)
- 特殊值:±0、非規格化數、±∞、NaN
- 精度限制:
float 約 7 位十進制有效數字,double 約 15 位
3. 字符類型
char 有符號性由實現定義(可為 signed/unsigned)
- 字符字面量
'a' 類型為 int(C89/C99),C++ 中為 char
- 多字節字符與寬字符(
wchar_t)支持國際化
4. 類型轉換
- 整型提升:
char/short → int(或 unsigned int)
- 常見算術轉換:雙操作數轉為同一類型,等級高者為準
- 賦值轉換:右值隱式轉換為左值類型,可能丟失精度/截斷
- 強制轉換:
(type)expr,指針轉換需謹慎(對齊、嚴格別名規則)
5. 結構體與內存對齊
- 成員按聲明順序分配,地址遞增
- 編譯器插入填充字節(padding)滿足對齊要求(通常為類型大小的倍數)
sizeof(struct) 為最大對齊數的倍數(尾部填充)
- 位域:節省空間但不可取地址,跨平台佈局不可移植
6. 聯合體
- 所有成員共享同一起始地址,大小 = 最大成員大小(對齊後)
- 同一時刻只能存儲一個成員值,讀取非寫入成員行為視實現定義
- 常用:類型雙關、協議數據解析、節省內存
重點掌握
- 有符號溢出是 UB,不可依賴環繞行為
- 浮點數比較需用 epsilon:
fabs(a-b) < 1e-6
- 結構體對齊影響內存佈局與網絡/文件序列化
- 聯合體類型雙關違反嚴格別名規則,現代 C 建議用
memcpy