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

斯坦福 CS107 開放課程筆記(二):資料表示、補碼原理與型別轉換底層機制

     編輯:關於C語言

基本型別大小與位元組織

型別大小
bool / char1 byte
short2 bytes
int2~4 bytes
float4 bytes
double8 bytes

1 byte = 8 bits,可表示 2⁸ 種組合。每個 bit 有權值(2⁰, 2¹ …)。

有號整數:從反碼到補碼

  • 反碼:符號位 1 表負,數值位取反。缺點:+7 + (-7) ≠ 0,硬體加法器需特判。
  • 補碼:反碼 + 1。核心動機:尋找一個數 x 使 +7 + x = 0。全 1 為 -1,+1 產生進位溢出符號位得 0。因此負數表示 = 正數取反 + 1。硬體只需一個加法器,統一處理有號/無號加減。

整型賦值與位元拷貝規則

擴展(小→大):符號位擴展

char ch = 'A';  // 0x41
short s = ch;   // 位元拷貝 + 高位補 0 → 0x0041 (65)

short s = -1;   // 0xFFFF
int i = s;      // 高位複製符號位 1 → 0xFFFFFFFF (-1 保持不變)

截斷(大→小):直接丟棄高位

short s = 67;   // 0x0043
char ch = s;    // 只取低 8 位 → 0x43 ('C'),數值可能改變

關鍵原則:整型賦值永遠是 bit pattern 直接複製,不懂「數值大小」,只認位元寬度。

浮點數 IEEE 754 單精度格式

32 位 = 1 符號位 + 8 位指數 (exp) + 23 位尾數

  • 實際值 = (-1)^sign × 2^(exp-127) × 1.尾數
  • 指數採「移碼」(bias 127),尾數隱含最高位 1(正規化)。

浮點與整數互轉:bit pattern 是否改變?

int i = 5;
float f = i;           // 語意轉換:產生 float 5.0,bit pattern 完全不同

int i = 37;
float f = *(float*)&i; // 強制重新解釋位元:bit pattern 不變,得到極小非正規化浮點數

float f = 7.0f;
short s = *(short*)&f; // 截取低 16 位解釋為 short,bit pattern 不變

總結:= 賦值會做語意轉換(bit pattern 改變);指標轉型 *(T*)&x 僅改變解釋方式(bit pattern 不變)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved