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

斯坦福 CS107 筆記(二):數據表示、補碼原理與類型轉換

     編輯:關於C

斯坦福大學 CS107《編程范式》課程第二講筆記:深入講解整數/浮點數底層表示、補碼形成原理、類型轉換時的位模式複製規則。

基本類型大小

類型大小
bool1 byte
char1 byte
short2 bytes
int2-4 bytes
float4 bytes
double8 bytes

位與字節

  • 1 byte = 8 bits = 2⁸ = 256 種組合
  • 每位有權重:2⁰, 2¹, 2²...(無符號)
  • short 2 bytes = 16 bits = 2¹⁶ 種組合

有符號整數表示演進

原碼

  • 最高位為符號位(0 正,1 負)
  • 缺陷:+0/-0 兩種零;減法需單獨邏輯

反碼

  • 負數 = 正數按位取反
  • 缺陷:仍有 +0/-0;+7 + (-7) = -0 ≠ +0

補碼(現代標準)

核心洞察:什麼數加上 +7 得 0?

  • 無符號 8 位:255 (0xFF) 是 -1,因為 255 + 1 = 256 → 溢出歸 0
  • 推廣:-x = (~x) + 1(取反加一)
  • 優勢:唯一零、加減法統一、硬件極簡

類型轉換:位模式複製

擴展:小類型 → 大類型


char ch = 'A';      // 0x41 = 65
short s = ch;       // 符號擴展:高位填符號位
// s = 0x0041 = 65
  • 正數/無符號:高位填 0
  • 負數:高位填 1(保持數值不變)
  • 規則:複製位模式,高位符號擴展

截斷:大類型 → 小類型


short s = 67;       // 0x0043
char ch = s;        // 直接截取低 8 位
// ch = 0x43 = 67
  • 直接丟棄高位位模式
  • 不關心數值大小,純位操作
  • 負數同理:short s = -1; char c = s; → c = -1 (0xFF)

浮點數 IEEE 754 表示

32 位 float:
┌─┬────────┬──────────────────────┐
│S│ Exp(8) │     Frac(23)         │
└─┴────────┴──────────────────────┘
S = 符號位
Exp = 指數(偏移 127,即真實指數 = Exp - 127)
Frac = 尾數(隱含最高位 1,即 1.Frac)
值 = (-1)^S × 2^(Exp-127) × 1.Frac

整數 ↔ 浮點轉換


// 整數轉浮點:數值保持,位模式完全改變
int i = 5;
float f = i;        // f = 5.0, 位模式 0x40A00000

// 指針強制轉換:位模式不變,重新解釋
int i = 37;
float f = *(float*)&i;  // 位模式 0x00000025 → 解釋為 float ≈ 5.18e-44

關鍵總結

操作位模式數值
賦值轉換 (int→float)改變保持
指針強轉 (int*→float*)不變改變
擴展 (char→int)高位擴展保持
截斷 (int→char)低位保留可能改變

經典面試題


float f = 7.0;
short s = *(short*)&f;  // 取 float 低 16 位解釋為 short
// f = 0x40E00000 → 低 16 位 0x0000 → s = 0

結語

理解「位模式複製」是掌握 C/C++ 底層行為的鑰匙。補碼的「取反加一」不再是死記規則,而是從「什麼數加 1 溢出歸零」的硬件視角自然推導。類型轉換分為「數值保持(賦值)」與「位模式保持(指針強轉)」兩類,前者改變位模式,後者改變解釋。這一思維框架能解決 90% 的類型轉換疑難雜癥。

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