首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

IEEE 754 浮點數 1.0 的機器碼表示詳解

     編輯:程式設計綜合問答

已知條件

  • float f = 1.0f;
  • 反彙編得 mov $0x3f800000, %eax
  • 二進制:0011 1111 1000 0000 0000 0000 0000 0000

IEEE 754 單精度佈局

| 符號位(1) | 指數位(8) | 尾數位(23) |
|    0      | 01111111  | 000...0    |

逐位解碼

  1. 符號位 S = 0 → 正數。
  2. 指數位 E = 0x7F = 127。
    • IEEE 754 規定 **偏移量 Bias = 127**(單精度)。
    • 真指數 e = E - Bias = 127 - 127 = 0。
  3. 尾數位 M = 0。
    • 隱含最高位 1 → 尾數值 1.M = 1.0。
  4. 值 = (-1)^S × 1.M × 2^e = 1.0 × 2^0 = 1.0 ✅

常見誤區澄清

誤區正確理解
以為移碼偏移量是 128 (0x80)IEEE 754 **單精度偏移量 = 127 (0x7F)**,雙精度 = 1023。非標準移碼(Excess-127),非標準移碼(Excess-128)。
以為指數全 0 表示 0指數全 0 表示**非規格化數**(或 ±0),隱含位為 0。規格化數指數範圍 1~254,對應真指數 -126~+127。
反推得補碼 -128錯誤地用「補碼+128」反推。正確:**真指數 0 + Bias 127 = 存儲指數 127 (0x7F)**。

關鍵公式速查

單精度:Bias = 127 (2^(8-1)-1)   指數範圍 [-126, +127]
雙精度:Bias = 1023 (2^(11-1)-1) 指數範圍 [-1022, +1023]
值 = (-1)^S × (1 + M/2^23) × 2^(E-Bias)  (規格化數)

驗證代碼

#include 
#include 

int main() {
    float f = 1.0f;
    uint32_t bits = *(uint32_t*)&f; // 0x3f800000
    int S = bits >> 31;
    int E = (bits >> 23) & 0xFF;      // 127
    int M = bits & 0x7FFFFF;          // 0
    printf("S=%d E=%d(0x%X) M=%d\n", S, E, E, M);
    printf("真指數 e = E - 127 = %d\n", E - 127);
    printf("值 = %f\n", f);
    return 0;
}

**IEEE 754 偏移量 = 2^(k-1) - 1**(k 為指數位寬)。單精度 k=8 → Bias=127。**不存在「補碼再加 128」**,直接「真指數 + Bias」得到存儲指數。1.0 的真指數 0,存儲指數 127 (0x7F),完美匹配 0x3F800000。

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