Appearance
题目
float 型数据通常用 IEEE754 单精度浮点数格式表示。若编译器将 float 型变量 x 分配在一个 32 位浮点寄存器 FR1 中,且 x=-8.25,则 FR1 的内容是( )
错因
B
把"-8.25"误算成了一个数量级大得多的负数。该位串对应 ,与 完全不沾边——一定是规格化阶段把小数点移位的方向 / 步数算错了,且尾数没去掉隐含的 1,导致整段比对错位。保险做法:每一步都按 "" 这种最朴素的形式写在草稿上,不要心算。
C
阶码 E=10000011=131,对应真值 4。尾数与正确答案完全一样,错只错在阶码。两种最常见的诱因——
- 偏移量记成 +128(套用了" 而不是 "的错误规则,正确的单精度偏移量是 +127)
- 直接把整数部分二进制位数当阶码:1000 是 4 位,就把 E=4。正确公式是 E = 整数部分位数 − 1,因为规格化后只保留 1 位整数(隐含的 1)
D
阶码 E=131(同 C 错)+ 尾数 11000010... 也错了——应当是 00001000...。两步同时出错,明显是没按 "符号 → 二进制 → 规格化 → 拆字段" 的标准流程走,建议看完正解后用题给数据完整复算一遍。
总解析
第一步:把 |x| 转成二进制
第二步:规格化为 IEEE 754 形式
把小数点左移 3 位:
所以真值 。
第三步:填入 32 位三段(符号 / 阶码 / 尾数)
- 符号位 (x 是负数)
- 阶码 = 真值 + 偏移量 =
- 关键易错点:单精度偏移量是 127(),不是 128
- 尾数 = 把 1.00001 中隐含的 1 去掉后的小数部分,再补 0 凑齐 23 位:
00001000000000000000000
第四步:4 位一组拼成十六进制
| 位区间 | 31..28 | 27..24 | 23..20 | 19..16 | 15..12 | 11..8 | 7..4 | 3..0 |
|---|---|---|---|---|---|---|---|---|
| 二进制 | 1100 | 0001 | 0000 | 0100 | 0000 | 0000 | 0000 | 0000 |
| 十六 | C | 1 | 0 | 4 | 0 | 0 | 0 | 0 |
→ C1040000H
最终答案是 A(C1040000H)。
单精度三大易错点速记:
- 偏移量是 127,不是 128
- 尾数 不含隐含的 1
- 真值阶码 = 整数部分位数 − 1(规格化后只剩 1 位整数)