首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

《C和指針》讀書筆記第3章:數據表示與類型系統

     編輯:關於C語言

章節核心內容

第 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. 聯合體

  • 所有成員共享同一起始地址,大小 = 最大成員大小(對齊後)
  • 同一時刻只能存儲一個成員值,讀取非寫入成員行為視實現定義
  • 常用:類型雙關、協議數據解析、節省內存

重點掌握

  1. 有符號溢出是 UB,不可依賴環繞行為
  2. 浮點數比較需用 epsilon:fabs(a-b) < 1e-6
  3. 結構體對齊影響內存佈局與網絡/文件序列化
  4. 聯合體類型雙關違反嚴格別名規則,現代 C 建議用 memcpy
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved