计算机组成原理-408考点-数的表示
常见题型:C语言中的有符号数和无符号数的表示。
【例1】有如下C语言程序段: short si=-32767;unsigned short usi=si;执行上述两条语句后,usi的值为___。short和unsigned short均使用16位二进制数表示。
【分析】考点:同一个二进制数,被视为无符号数和有符号数的补码时,其真值是多少?
以八位二进制数的表示为例,考虑无符号和有符号数的补码的真值:
无符号数X1 | 有符号数的补码X2 | |
---|---|---|
0000 0000 | 0 | 0 |
...... | ...... | ...... |
0111 1111 | 127 | +127 |
1000 0000 | 128 | -128 |
...... | ...... | ...... |
1111 1111 | 255 | -1 |
通过观察可以看到,从1000 0000开始,同一个八位二进制数, X1+|X2|始终等于256,也就是。所以,答案应该为
。
【例2】一个C语言程序在一台32位机上运行。程序中定义了三个变量x, y和z,其中x和z为int型,y为short型。当x=127,y= -9时,执行赋值语句z=x+y后,x,y和z的值分别是( )。
A. x=0000007FH, y=FFF9H, z=00000076H
B. x=0000007FH, y=FFF9H, z=FFFF0076H
C. x=0000007FH, y=FFF7H, z=FFFF0076H
D. x=0000007FH, y=FFF7H,z=00000076H
【分析】 考点:混合类型变量的加法中会涉及到强制转换类型以及符号扩展。
(1)混合类型变量:z=x+y, x为int,y为short
(2)强制转换类型:y要转换为int。所以会涉及到符号扩展。y是负数,符号扩展后,高位补符号位1。根据2's complement的思想,故y的补码应该是7结尾的,故淘汰A和B。
(3)由于z=x+y=136, 为正数,故只能选D。
【例3】假定变量i、f和d的数据类型分别为int、float和double。 int用补码表示,float和 double分别用IEEE 754单精度和双精度浮点数格式表示。已知i=785、f= 1.5678E3、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和II
B. 仅I和III
C. 仅II和III
D. 仅III和IV
【分析】考点:IEEE754下浮点数的范围。
1. 选项I涉及到int→float→int:根据IEEE754下float的范围知道,当原int数在-2^24与2^24之间时,两次转换后结果不变。
2. 选项II涉及到float→int→float:若原float值的小数部分为0(即纯整数)且在int范围内,则
转换后值不变。 若原float值有非零小数部分,则值会改变。如果float的值超过INT_MAX或小于INT_MIN,转换为int会导致溢出。
3. 选项III涉及到float→double→float:(1)float是32位单精度浮点数,包含1位符号位、8位指数位和23位尾数位。转换为double(64位双精度,1位符号、11位指数、52位尾数)时,数值会被精确扩展:符号位不变,指数部分通过调整偏移量(从127到1023)扩展为11位,尾数补零至52位。(2)再转回float时,若原double值由float扩展而来,其指数和尾数均在float的范围内。尾数部分截断后23位与原float相同,指数也通过调整偏移量(从1023到127)正确还原。
4. 选项IV:等式左侧计算出来的结果是double,等式右侧计算出来的结果是float,不相等。
故,只有I和III是正确的。