斯坦福大學 CS107《編程范式》課程第二講筆記:深入講解整數/浮點數底層表示、補碼形成原理、類型轉換時的位模式複製規則。
| 類型 | 大小 |
|---|---|
| bool | 1 byte |
| char | 1 byte |
| short | 2 bytes |
| int | 2-4 bytes |
| float | 4 bytes |
| double | 8 bytes |
short 2 bytes = 16 bits = 2¹⁶ 種組合核心洞察:什麼數加上 +7 得 0?
char ch = 'A'; // 0x41 = 65
short s = ch; // 符號擴展:高位填符號位
// s = 0x0041 = 65
short s = 67; // 0x0043
char ch = s; // 直接截取低 8 位
// ch = 0x43 = 67
short s = -1; char c = s; → c = -1 (0xFF)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% 的類型轉換疑難雜癥。