🏷️ 知识点:类型转换

共 8 道相关题目

2024 年第 12 题 组成原理 选择题

C 语言代码如下:

int i = 32777;

short si = i;

int j =si;

执行上述代码段后,j 的 值 为 ( ) 。

A.-32777

B.-32759

C.32759

D.32777

[tag_link]

正确答案:B

int i=32777 ,赋值给 short 后,由于 short 只有 16 位,则只会保留 i 的低 16 位,同时,short 的上限为 2 15 − 1 即 32767,所以 32777 在 short 类型的变量中会出现数据溢出问题,32777=32767+9,则溢出后的二进制补码为 1000000000001001。再将此数转为 int,此时将进行符号扩展,补高 16 位的时候取决于当前 short 的符号位,若符号位为 1,则高 16 位补 16 个 1,若符号位为 0,则高 16 位补 16 个 0,所以本题补 16 个 1,结果为补码 1111 …. 1000 0000 0000 1001,换算成原码再计算,选 B。或者使用排除法,最终通过补码的最高位 1 可以断定该数为负数,A、B 里面选,32777 对于 short 已经溢出,转为 short 再符号扩展,并不只是单纯地改变子符号,故排除 A,选 B。


2025 年第 12 题 组成原理 选择题

在32 位计算机上执行下列 C 语言代码:

short si =-32767;

unsigned int ui = si; 变量 ui 的值为()。

A.2¹⁵-1

B.2¹⁵+1

C.2³²-21⁵-1

D.2³²-215+1

[tag_link]

正确答案:D

本题考察 无符号数 和 有符号数 的补码表示。16 位的 short 类型的 -32767 的二进制表示为 1000 0000 0000 0001,将其转化为 32 位的 unsigned 时,需要在最高位扩展 16 位。由于 -32767 (short) 的最高位为 1,所以扩展的高位全部为 1。由此得到 32 位的 unsigned 的二进制是 1111 1111 1111 1111 1000 0000 0000 0001,其值为 1 + 2 15 + 2 16 + ⋯ + 2 31 = 2 32 − 2 15 + 1 。


2012 年第 13 题 组成原理 选择题

假定编译器规定int 和 short 型长度分别为32位和16位,执行下列C 语言语句:

unsigned short x=65530;

unsigned int y=x;

得到y的机器数为()。

A.00007FFAH

B.0000 FFFAH

C.FFFF 7FFAH

D.FFFF FFFAH

[tag_link]

正确答案:B

将一个 16 位 unsigned short 转换成 32 位形式的 unsigned int,因为都是无符号数,新表示形式的高位用 0 填充。16 位无符号整数所能表示的最大值为 65 5 35,其十六进制表示为 FFFFH,故 x 的十六进制表示为 FFFFH - 5H = FFFAH,所以 y 的十六进制表示为 0000 FFFAH。


2016 年第 13 题 组成原理 选择题

有如下C 语言程序段

short si = -32767;

unsigned short usi =si;

执行上述两条语句后,usi的 值 为 ( ) 。

A. -32767 B. 32767 C. 32768 D. 32769

[tag_link]

正确答案:D

结合题干及选项可知,short 为 16 位。因 C 语言中的数据在内存中为 补码表示 ,si 对应的补码二进制表示为:1000 0000 0000 0001B, 最前面的一位 “1” 为符号位,表示负数,即 -32767。由 signed 型转化为等长 unsigned 型数据时,符号位成为数据的一部分,也就是说,负数转化为无符号数(即正数),其数值将发生变化。usi 对应的补码二进制表示与 si 的表示相同,但表示正数,为 32769。


2018 年第 13 题 组成原理 选择题

假定带符号整数采用补码表示,若int 型变量x 和y 的机器数分别是FFFF FFDFH和00000041H, 则 x、y的值以及X-y的机器数分别是()。

A.x=-65,y=41, x-y的机器数溢出

B.x=-33,y=65,x -y 的机器数为FFFFFF9DH

C.x=-33,y=65, x-y的机器数为FFFFFF9EH

D.x=-65,y=41, x-y的机器数为FFFFFF96H

[tag_link]

正确答案:C

利用 补码转换成原码的规则 :负数符号位不变数值位取反加 1;正数补码等于原码。两个机器数对应的原码是 [x]原 = 80000021H,对应的数值是 -33,[y]原=[y]补=00000041H=65。排除 A、D 选项。x-y 直接利用补码减法准则,[x]补-[y]补 =[x]补+[-y]补,-y 的补码是连同符号位取反加 1,最终减法变成加法,得出结果为 FFFFFF9EH。


2019 年第 13 题 组成原理 选择题

考虑以下C 语言代码:

unsigned short usi = 65535; short si =usi;

执行上述程序段后,si 的 值 是 ( ) 。

A. -1 B. -32767 C. -32768 D. -65535

[tag_link]

正确答案:A

unsigned short 类型为 无符号 短整型,长度为 2 字节,因此 unsigned short usi 转换为二进制代码即 1111 1111 1111 1111。short 类型为短整型,长度为 2 字节,在采用 补码 的机器上 short si 的二进制代码为 1111 1111 1111 1111,因此 si 的值为 -1,所以选 A。


2010 年第 14 题 组成原理 选择题

假定变量 i 、f 和 d 的数据类型分别为 int 、float 和 double(int 用补码表示,float 和 double 分别 用 IEEE 754单精度和双精度浮点数格式表示),已i=785,f=1.5678c3,d=1.5e100 。 若在32 位机器中执 行下列关系表达式,则结果为“真”的是()。

(I)i=(int)(float)i (II)f=(float)(int)f

(III)f=(float)(double)f (IV)(d+f)-d=f

A. 仅 I 和 Ⅱ B. 仅 I 和 Ⅲ C. 仅 Ⅱ 和 Ⅲ D. 仅 Ⅲ 和 IV

[tag_link]

正确答案:B

本题考查 不同长度的类型转换 ,题中三种数据类型的精度从低到高为 int → float → double。

变量说明: i = 785 (int):32 位整数,用补码表示。

f = 1.5678e3 = 1567.8 (float):32 位 IEEE754 单精度浮点数。

d = 1.5e100 (double):64 位 IEEE754 双精度浮点数。

对于 I. i == (int)(float)i i 是整数 785。

(float)i 会把整数 785 转为浮点数 —— 精度 足够准确表示 785 。

再 (int)(float)i 转回整数,仍然是 785。

✅ 结果:真 对于 II. f == (float)(int)f f = 1567.8 ,转换为 (int)f 得到 1567 (小数部分被截断)。

再转回 (float)(int)f 得到 1567.0。

显然:1567.8 ≠ 1567.0 ❌ 结果:假 对于 III. f == (float)(double)f f 是 float(32 位),被转为 double (64 位)后,再强转回 float 。

由于 double 转 float 的精度缩减回原始,值不变。

所以整体等价于 f == f 。

✅ 结果:真 对于 IV. (d + f) - d == f d = 1.5e100 (极大), f = 1567.8 (非常小,相比于 d)。

d + f ≈ d (因为 f 精度在 d 这个数量级上被吞掉, f 被舍入掉 )。

所以 (d + f) - d ≈ 0 ,不等于 f ❌ 结果:假 所以 正确答案:I、III ,答案选择 B。


2011 年第 43 题 组成原理 综合题

假定在一个 8 位字长的计算机中运行如下 C 程序段:

unsigned int x=134;
unsigned int y=246;
int m=x;
int n=y;
unsigned int z1=x-y;
unsigned int z2=x+y;
int k1=m-n;
int k2=m+n;

若编译器编译时将 8 个 8 位寄存器 R1~R8 分别分配给变量 x、y、m、n、z1、z2、k1 和 k2。请回答下列问题。(提示:带符号整数用补码表示)

(1) 执行上述程序段后,寄存器 R1、R5 和 R6 的内容分别是什么(用十六进制表示)?

(2) 执行上述程序段后,变量 m 和 k1 的值分别是多少(用十进制表示)?

(3) 上述程序段涉及带符号整数加/减、无符号整数加/减运算,这四种运算能否利用同一个加法器及辅助电路实现?简述理由。

(4) 计算机内部如何判断带符号整数加/减运算的结果是否发生溢出?上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?

补码 类型转换

[tag_link]

1)134 = 128 + 6 = 1000 0110B,所以 x 的机器数为 1000 0110B,故 R1 的内容为 86H。246 = 255 - 9 = 1111 0110B,所以 y 的机器数为 1111 0110B。x-y: 1000 0110 + 0000 1010 = (0)1001 0000,括弧中为加法器的进位,故 R5 的内容为 90H。x+y: 1000 0110 + 1111 0110 = (1)0111 1100,括弧中为加法器的进位,故 R6 的内容为 7CH。

2)m 的机器数与 x 的机器数相同,皆为 86H=1000 0110B,解释为带符号整数 m(用补码表示)时,其值为 -1111010B = -122。m-n 的机器数与 x-y 的机器数相同,皆为 90H=1001 0000B,解释为带符号整数 k1(用补码表示)时,其值为 -1110000B = -112。

3)能。n 位加法器实现的是模2n无符号整数加法运算。对于无符号整数 a 和 b,a + b 可以直接用加法器实现,而 a - b 可以通过 a 加上 b 的补数来实现,即 a - b 等价于 a 加上 -b 的补码,结果对 2 的 n 次方取模。因此,n 位无符号整数的加法和减法运算都可以通过 n 位加法器实现。由于带符号整数使用补码表示,其加减法遵循的公式是:a + b 的补码等于 a 的补码加上 b 的补码,结果对 2 的 n 次方取模;同样,a - b 的补码等于 a 的补码加上 -b 的补码,结果也对 2 的 n 次方取模。因此,n 位带符号整数的加减运算也都可以通过 n 位加法器完成。

4)带符号整数加/减运算的溢出判断规则为:若加法器的两个输入端(加法)的符号相同,且不同于输出端(和)的符号,则结果溢出,或加法器完成加法操作时,若次高位的进位和最高位的进位不同,则结果溢出。最后一条语句执行时会发生溢出。因为 10000110+11110110=(1)01111100,括弧中为加法器的进位,根据上述溢出判断规则,可知结果溢出。或因为 2 个带符号整数均为负数,它们相加之后,结果小于 8 位二进制所能表示的最小负数。