Appearance
题目
已知带符号整数用补码表示,变量 x、y、z 的机器数分别为 FFFDH、FFDFH、7FFCH,下列结论中,正确的是( )。
错因
A
无符号比较时确实 z 最小(z 的最高位是 0、x 和 y 的最高位都是 1),但 x 和 y 的大小关系搞反了。FFFD = 65533,FFDF = 65503,应该 y < x,而不是 x < y。可能只比对了第三位 F vs D,误以为 D < F 就让位置上含 D 的 y 排在 x 后面,但 x 第三位是 F、第四位是 D,y 第三位是 D——位高的差异(FFFD 的第三位 F vs FFDF 的第三位 D)才决定大小,更高位的差异先生效。
B
完全没区分"无符号 vs 有符号"。无符号下,最高位仍按数值位计入,FFxx 全都比 7Fxx 大得多——绝不可能 x < z。这个错误源于把"带符号下负数比正数小"的直觉错带进了无符号语境。
C
正确判断了"x、y、z 中只有 z 是正数(最高位 0),x 和 y 是负数(最高位 1)",但忽略了负数的补码越靠近 0xFFFF 越接近 0、越靠近 0x8000 越小。x = FFFD = -3、y = FFDF = -33,y 离 0xFFFF 更远(更小),所以 y < x——选项 C 把 x、y 的次序搞反了。
总解析
第一步:把三个机器数分别按"无符号"和"有符号补码"翻成真值
| 机器数 | 无符号真值 | 有符号补码真值 |
|---|---|---|
| x = FFFDH | 65533 | |
| y = FFDFH | 65503 | |
| z = 7FFCH | 32764 |
有符号真值的快速求法(最高位为 1 时是负数):
- FFFDH:,所以补码值 (公式:负补码真值 = ,等价于"")
- FFDFH:,补码真值
- 7FFCH:最高位 0,正数,直接读 =
第二步:分别排序
无符号下: → z < y < x(A、B 都不对)
有符号下: → y < x < z(D 命中)
第三步:核对选项
- A "z < x < y":错(应为 z < y < x)
- B "x < y < z":错(无符号下 z 最小,绝不可能在最大位)
- C "x < y < z":错(应为 y < x < z)
- D "y < x < z":✓
最终答案是 D。
关键易错点速记:
- 同一机器数在无符号和有符号下大小关系完全可能相反——无符号 FFFD 是最大数附近,有符号下却是 (接近 0)
- 负数补码:越靠近 0xFFFF 越接近 0。FFFD(=-3)比 FFDF(=-33)大
- 看到一堆 FFxx 形式的机器数,先判断 hi-bit 决定无符号 / 有符号语义,再按各自规则排序