float f = 1.0f;mov $0x3f800000, %eax0011 1111 1000 0000 0000 0000 0000 0000| 符號位(1) | 指數位(8) | 尾數位(23) |
| 0 | 01111111 | 000...0 |
e = E - Bias = 127 - 127 = 0。1.M = 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。