Skip to content

2012年 408 计算机组成原理 第 13 题

计算机组成原理2012年选择题2分

题目

假定编译器规定 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:

3116高16位补016 bits0000000000000000150原值x16 bitsFFFA

得到 32 位结果:

第三步:扩展规则的辨析

源类型目标类型扩展方式高位填什么
unsigned → unsigned 更宽无关符号零扩展0
signed → signed 更宽同符号符号扩展复制符号位
unsigned → signed 更宽与源无关零扩展0(按源的无符号语义)
signed → unsigned 同宽类型变了,位串不变无扩展

判定要点:扩展规则只看源类型,不看目标类型——unsigned short 是源,无论目标是什么,都按零扩展走。

最终答案是 B(0000 FFFAH)

编者注(格式修复):原题面在 C 代码后直接断开,缺少"得到 y 的机器数为( )"这句问题文字(OCR/抄写漏行),已按真题原文补回。

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题