浮點數在記憶體中以 IEEE 754 標準儲存,採用「符號位 + 移碼階碼 + 隱含首位尾數」的科學計數法形式。本文從十進制小數轉二進制、移碼原理、單雙精度佈局、特殊值表示等維度系統闡述。
算法:小數部分連乘 2,取整數序列為二進制小數位(正序)。
0.25 × 2 = 0.5 → 0 0.5 × 2 = 1.0 → 1 → 0.25 = 0.01₂ 0.2 × 2 = 0.4 → 0 0.4 × 2 = 0.8 → 0 0.8 × 2 = 1.6 → 1 0.6 × 2 = 1.2 → 1 0.2 × 2 = 0.4 → 0 (循環) → 0.2 = 0.00110011...₂ (無限循環)
結合整數部份:8.25 = 1000.01₂。
移碼 = 真值 + Bias(偏移量)。8 位 Bias = 127(非 128)。
| 真值 | 補碼 (8位) | 移碼 (Bias=127) |
|---|---|---|
| -127 | 1000 0001 | 0000 0000 |
| 0 | 0000 0000 | 0111 1111 |
| +127 | 0111 1111 | 1111 1110 |
核心優勢:移碼保持數值大小順序與無符號整數比較順序一致(0 < 1 < 2...),硬體比較器可直接比較階碼大小,無需轉換符號位。補碼負數最高位為 1,會被視為「大於」正數,破壞順序性。
補充:文中提到的「補碼符號位取反」得出的 1000 0001 對應 Bias=128,實際 IEEE 754 採用 Bias=127(單精度)與 1023(雙精度)。
SEEE EEEE EMMM MMMM MMMM MMMM MMMM S: 符號位 (1 bit) 0=正, 1=負 E: 階碼 (8 bits) 移碼,Bias=127 M: 尾數 (23 bits) 隱含首位 1,實際精度 24 bits
E ∈ [1, 254],值 = (-1)^S × 1.M × 2^(E-127)。E = 0, M ≠ 0,值 = (-1)^S × 0.M × 2^(-126)(漸進下溢)。E = 0, M = 0(±0)。E = 255, M = 0(±∞)。E = 255, M ≠ 0。SEEE EEEE EEEE MMMM ... (共 64 bits) S: 1 bit E: 11 bits, Bias = 1023 M: 52 bits, 隱含首位 1 → 53 bits 精度
float f = 8.25f;
1000.01 = 1.00001 × 2^31000 001000001 後補 0 至 23 位 = 0000 1000 0000 0000 0000 000000 00 20 41 (十六進制)#include#include void printFloatBits(float f) { uint32_t bits = *(uint32_t*)&f; printf("0x%08X ", bits); for (int i = 31; i >= 0; --i) putchar((bits >> i) & 1 ? '1' : '0'); putchar('\n'); } int main() { printFloatBits(8.25f); // 0x41200000 01000001001000000000000000000000 printFloatBits(-1.0f); // 0xBF800000 10111111100000000000000000000000 printFloatBits(0.0f); // 0x00000000 printFloatBits(1.0f/0.0); // 0x7F800000 +Inf return 0; }
unsigned float,編譯器報錯/警告。浮點數記憶體佈局體現「空間換精度、移碼利比較、隱含首位增精度」三大設計智慧。理解其結構有助於分析精度損失、處理特殊值、實現高效序列化/反序列化,也是逆向工程、嵌入式協定解析的基礎技能。