Appearance
题目
已知 x、y 为 int 类型,当 x = 100,y = 200 时,执行 x − y 指令得到的溢出标志 OF 和借位标志 CF 分别为 0、1,那么当 x = 10,y = −20 时,执行该指令得到的 OF 和 CF 分别是( )。
错因
A
只看了"有符号"角度:,结果在 int 范围内 → OF = 0 ✓;然后默认 CF 也为 0,理由"两个数都不大,没什么借位"。但 CF 是按无符号视角判断的—— 在 32 位无符号下是 4 294 967 276,远大于 ,做无符号减法必产生借位,CF = 1。错在没切换到无符号视角看 CF。
C
把 OF 当成 CF、CF 当成 OF。 在有符号 int 里没有溢出(OF 应为 0),在无符号视角下产生借位(CF 应为 1)。把两者写反就是 C。常见原因:记忆里"OF/CF 哪个是符号哪个是无符号"模糊不清。
D
把 OF 也判成 1。可能基于"有符号 −20 减出来的结果好像很大"或者"加法符号位变化"硬套了 OF 公式。但 OF 的判定有明确条件:两个加数符号相同、和的符号与加数相反才溢出。 等价 ,两加数都正、和也是正,没有溢出,OF = 0。
总解析
先理顺两个标志位的语义
| 标志 | 视角 | 判定 |
|---|---|---|
| OF(Overflow Flag) | 有符号 | 加法:两加数同号、和的符号相反 → OF = 1。减法 看作 同样判 |
| CF(Carry/Borrow Flag) | 无符号 | 减法:被减数(无符号)< 减数(无符号),需要借位 → CF = 1 |
用题目给的样例校验定义:x = 100,y = 200,x − y。
- 有符号:,结果在 int 范围内 → OF = 0 ✓
- 无符号:100 < 200,需要借位 → CF = 1 ✓
两者都对得上,确认这台机器的标志位语义就是上面那张表。
代入 x = 10, y = −20
OF(有符号视角):
把减法转成加法 :两加数都是正数(同号),和 30 也是正数(同号)→ 没有溢出,OF = 0。
CF(无符号视角): 的 32 位补码 = 0xFFFF_FFEC,无符号 = ,是个非常大的正数。
显然要借位 → CF = 1。
最终答案是 B(OF = 0, CF = 1)。
记忆口诀:"OF 看符号,CF 看无符号"——这俩标志位看的是同一份二进制位,但解释方式不同,OF 关心补码的有符号溢出,CF 关心无符号下的借位/进位。