Appearance
题目
假定编译器规定 int 和 short 型长度分别为 32 位和 16 位,执行下列 C 语言语句:
c
unsigned short x = 65530;
unsigned int y = x;得到 y 的机器数为( )。
错因
A
把 65530 错算成了 0x7FFA。,不是 65530。常见错误:把 当成 unsigned short 的最大值——但 unsigned short 没有符号位,所有 16 位都用作数值,最大值是 ,65530 落在合法范围内。
C
把 x 当成有符号整数,认为它是负数 → 高位扩展时复制符号位(符号扩展),得到高 16 位全是 1(FFFF),低 16 位又错算成 7FFA。两个错叠加。题目明写 unsigned short,完全没有符号位——零扩展,与正负无关。
D
正确识别了 0xFFFA 的低 16 位,但把扩展规则用错了——按符号扩展把高位填成 FFFF。问题在于:即便 0xFFFA 的最高位是 1(看起来像"负数"),无符号类型永远是零扩展,最高位不参与"符号"判断。把"长得像负数的位串"当成负数处理是经典陷阱。
总解析
第一步:把 65530 转成 16 位无符号机器数
按位写:
简单验证: ✓
所以 unsigned short x 的 16 位机器数 = 0xFFFA。
第二步:从 16 位 unsigned short 扩展到 32 位 unsigned int
C 语言规则——无符号 → 无符号(更宽)扩展时一律零扩展,把高位补 0:
得到 32 位结果:
第三步:扩展规则的辨析
| 源类型 | 目标类型 | 扩展方式 | 高位填什么 |
|---|---|---|---|
| unsigned → unsigned 更宽 | 无关符号 | 零扩展 | 0 |
| signed → signed 更宽 | 同符号 | 符号扩展 | 复制符号位 |
| unsigned → signed 更宽 | 与源无关 | 零扩展 | 0(按源的无符号语义) |
| signed → unsigned 同宽 | 类型变了,位串不变 | 无扩展 | — |
判定要点:扩展规则只看源类型,不看目标类型——unsigned short 是源,无论目标是什么,都按零扩展走。
最终答案是 B(0000 FFFAH)。
编者注(格式修复):原题面在 C 代码后直接断开,缺少"得到 y 的机器数为( )"这句问题文字(OCR/抄写漏行),已按真题原文补回。