Appearance
题目
假定带符号整数采用补码表示,若 int 型变量 x 和 y 的机器数分别是 FFFF FFDFH 和 0000 0041H,则 x、y 的值以及 x-y 的机器数分别是( )。
错因
A
把 y 的真值算成"41"——直接把 0x41 当成十进制的 41,没换算成 65(0x41 = 4×16 + 1 = 65)。x 也算错(0xFFFFFFDF 的绝对值算成 0x41 = 65 → x=-65)。又错判溢出:异号相减结果在范围内不会溢出,所谓"溢出"只是缺乏对溢出判定规则的把握时的拍脑袋结论。
B
真值都对(x=-33,y=65),但 x-y = -98 的补码末位算错。-98 的二进制末两位应是 1110_(=0xE),写成 1101_(=0xD) 差了 1。原因是求 -98 的补码时"取反加 1"少加了 1,或者把 +98 的二进制末位记错。
D
真值大半搞反——把 x 算成 -65、y 算成 41(同 A 的错),相减 -65-41 = -106 → 补码 0xFFFFFF96。算式逻辑链自洽(这就是迷惑性所在),但起点错了:y 的 0x41 被当成十进制 41 而不是十六进制(=65)。
总解析
第一步:求 x 的真值
x = 0xFFFF_FFDF,最高位是 1 → x 是负数。
求绝对值("取反加 1"):
| 步骤 | 二进制(按字节展开末段) | 十六进制 |
|---|---|---|
| x 机器数 | 1111 1111 1111 1111 1111 1111 1101 1111 | FFFFFFDF |
| 按位取反 | 0000 0000 0000 0000 0000 0000 0010 0000 | 00000020 |
| 加 1 | 0000 0000 0000 0000 0000 0000 0010 0001 | 00000021 |
→ x = −33。
第二步:求 y 的真值
y = 0x0000_0041,最高位是 0 → y 是正数。
→ y = 65。
第三步:算 x − y
求 -98 的 32 位补码:
| 步骤 | 末段二进制 | 十六进制 |
|---|---|---|
| +98 二进制 | 0110 0010 | 0x62 |
| 32 位填 0 | 0000...0000 0110 0010 | 0x00000062 |
| 按位取反 | 1111...1111 1001 1101 | 0xFFFFFF9D |
| 加 1 | 1111...1111 1001 1110 | 0xFFFFFF9E |
x − y 的机器数 = FFFFFF9EH。
最终答案是 C(x=-33,y=65,x-y 的机器数为 FFFFFF9EH)。
也可以用减法直接做(验证):
按位相减(借位较繁,建议反过来用 [-y]补 加法验证):
[-y]补 = 0xFFFFFFBF(65 → -65 的补码)
最高的进位丢弃,结果 = 0xFFFFFF9E ✓
易错点速查:
- 0x41 ≠ 41。十六进制 4 个字符全是数字时最容易被误读为十进制——养成习惯:写真值前先逐位 ×16
- -98 的补码不是 -99 —
取反 +1那一步的 "+1" 不能漏 - 异号数相减永远不会溢出(结果绝对值 ≤ 较大的那个绝对值)