Appearance
题目
已知带符号整数用补码表示,float 型数据用 IEEE 754 标准表示,假定变量 x 的类型只能是 int 或 float。当 x 的机器数为 C800 0000H 时,x 的值可能是( )。
错因
B
按 float 解读但偏移量算成 128。0xC8000000 → S=1, E=10010000=144, M=0;正确真值阶码 = 144-127 = 17,值 = -2¹⁷。如果把偏移当 128,得 144-128 = 16,值 = -2¹⁶。这是 IEEE 754 题最常见的偏移量错误。
C
按 float 解读但漏掉符号位。S=1 是负数,但选 C 写成正的 2¹⁷——可能没注意 0xC 的二进制最高位是 1。把符号位 S 当成阶码的一部分也是这个错的常见来源。
D
按 int 补码解读但取反加 1 算错。0xC8000000 取反 = 0x37FFFFFF,再 +1 = 0x38000000 = 0011_1000_0...0;正确算法是 0x38 = 56 = 7×8 = 7 × 2³,再 × 2²⁴(因为后面 24 个 0)= 7 × 2²⁷。如果把 0x38 错算成 25 × ...(凭空多出 25),结果就掉 D。
总解析
关键:x 的真值取决于解读方式——题给的是机器数(位串),同一位串按 int 补码 vs 按 float 解读会得到完全不同的真值。两种都要算,看哪个出现在选项里。
机器数 0xC800_0000,二进制 = 1100 1000 0000 0000 0000 0000 0000 0000。
第一种解读:按 int 补码
最高位 1 → 负数。求 |x|:
| 步骤 | 二进制 | 十六进制 |
|---|---|---|
| 原 | 1100 1000 0...0 | C8000000 |
| 取反 | 0011 0111 1...1 | 37FFFFFF |
| +1 | 0011 1000 0...0 | 38000000 |
把 0x38000000 拆分:
所以按 int 解读:。
对照选项 A —— 命中。
第二种解读:按 IEEE 754 单精度 float
| 字段 | 值 | 含义 |
|---|---|---|
| S | 1 | 负数 |
| E | 10010000₂ = 144 | 阶码字段 |
| M | 0...0 | 尾数全 0 |
真值阶码 = 144 - 127 = 17;尾数 = 1.0(隐含的 1 + 全 0 小数)。
按 float 解读:。
两种解读结果:
| 解读方式 | x 真值 |
|---|---|
| 按 int 补码 | −7 × 2²⁷ |
| 按 IEEE 754 float | −2¹⁷ |
对照选项:
| 选项 | 值 | 来源 |
|---|---|---|
| A | −7 × 2²⁷ | int 补码 ✓ |
| B | −2¹⁶ | (float 偏移算错为 128) |
| C | 2¹⁷ | (float 漏符号) |
| D | 25 × 2²⁷ | (int 取反加 1 算错) |
只有 A 出现在合法解读结果里。
最终答案是 A(−7 × 2²⁷)。
两种解读对照表:
| 0xC8000000 解读 | int 补码 | IEEE 754 float |
|---|---|---|
| 真值 | −7 × 2²⁷ | −2¹⁷ |
| 数量级 |
易错点速查:
- 题干"x 类型只能是 int 或 float"提示要算两种解读
- IEEE 754 单精度偏移量 = 127(不是 128)
- 整数转十六进制时:
38= ,要会拆"含因子 2 的次幂" - 解读为 int 时,全 24 位末尾是 0 提示真值是某个 的整数倍