计算机组成原理——数据的表示与运用
数值与编码
进位记数制及其相互转换
十进制、二进制、八进制、十六进制
真值、机器数(原码、反码、补码)
字符与字符串的编码(小端和大端方式存储 )
数据校验
奇偶校验、CRC冗余校验、海明校验
定点数的表示和运算
无符号数的表示,有符号数的表示
定点数的运算
移位、原码加/减、补码加/减、乘/除、溢出判别
浮点数的表示和运算
浮点:表示范围、IEEE754标准、浮点数加/减运算
ALU结构
串行加法器和并行加法器、ALU的功能和结构
2009
12.一个 C 语言程序在一台 32 位机器上运行。程序中定义了三个变量 xyz,其中 x 和 z 是 int型,y 为 short 型。当 x=127,y= -9 时,执行赋值语句 z=x+y 后,xyz 的值分别是
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
答案:D
考点:整数的补码表示和补码加法。x和z是int型,占四个字节,y是short型占两个字节。
y=-9的二进制原码为1000 0000 0000 1001
补码=原码取反+1 为1111 1111 1111 0111 = (FFF7)16
而在进行x+y时,int型能够表示所有的short类型,所以现将short转为int再相加为118
13.浮点数加减运算过程一般包括对阶、尾数运算、规格化、舍入和判溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为 5 位和 7 位(均含 2 位符号位)。若有两个数 X=27×29/32,Y=25×5/8,则用浮点加法计算 X+Y 的最终结果是
A.00111 1100010 B.00111 0100010
C.01000 0010001 D.发生溢出
答案:D
考点:浮点数加法运算
双符号位法溢出判断
根据题意,X可记为00,111;00,11101(分号前为阶码,分号后为尾数),
Y可记为00,101;00,10100(20/32)
(1)对阶,X、Y阶码相减,即00,111-00,101=00,111+11,0111=00,010,可知X的阶码比Y的价码大2,根据小阶向大阶看齐的原则,将Y的阶码加2,尾数右移2位,可得Y为00,111;00,00101;
(2)尾数相加,即00,11101+00,00101=01,00010,尾数相加结果符号位为01,故需进行右规;
(3)规格化,将尾数右移1位,阶码加1,得X+Y为01,000;00,10001,阶码符号位为01,说明发生溢出,故选D。
2010
13.假定有4个整数用8位补码分别表示r1=FEH,r2=F2H,r3=90H,r4=F8H,若将运算结果存放在一个8位寄存器中,则下列运算会发生溢出的是()
A. r1 x r2
B. r2 x r3
C. r1 x r4
D. r2 x r4
答案:B
用补码表示时8位寄存器所能表示的整数范围为-128到+127。
r1=(15×16+14)-256=-2;
r2=(15×16+2)-256=-14;
r3=(9×16+0)-256=-112;
r4=(15×16+8)-256=-8;
则r1×r2=28,r2×r3=1568,r1×r4=16,r2×r4=112,只有r2×r3结果溢出。
14.假定变量i,f,d数据类型分别为int, float, double(int用补码表示,float和double用IEEE754单精度和双精度浮点数据格式表示),已知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和I
答案:B
考查不同精度的数在计算机中的表示方法及其相互装换。
在c++中为了尽量保证精度不丢失,一般会把低转化为高精度,比如char->int->float->double
由于(int)f=1,小数点后面4位丢失,故Ⅱ错。Ⅳ的计算过程是先将f转化为双精度浮点数据格式,然后进行加法运算,故(d+f)-d得到的结果为双精度浮点数据格式,而f为单精度浮点数据格式,故Ⅳ错。
(Ⅰ)i=(int)(float)i//i变成浮点数,不变;
(Ⅱ)f=(floal)(int)f//f变成整数时,精度变小;
(Ⅲ)f=(float)(double)f//f转为双精度,大小不变;
(Ⅳ)(d+f)-d=f//双精度值==单精度值,结果出错。
2011
13.float型数据通常用IEEE 754单精度浮点数格式表示。若编译器将float型变量x分配在一个32位浮点寄存器FR1中,且x = -8.25,则FR1的内容是
A.C104 0000H B.C242 0000H
C.C184 0000H D.C1C2 0000H
答案:A
x=-8.25=(-1000.01)2﹦(-1.000 01×23)2
阶码=E=e+127=130=(1000 0010)2,
单精度浮点数格式: 1位数符,8位阶码(含阶符),23位尾数(格式化原码尾数的最高位恒为1,所以不在尾数中表示出来,计算时在尾数前面自动添加1)
故FR1内容为:
1 1000 0010 000 0100 0000 0000 0000 0000
即1100 0001 0000 0100 0000 0000 0000 0000,
即C1040000H
43(11分)假定在一个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的内容分别是什么?(用十六进制表示)
R1存储的是134,转换成二进制为1000 0110B,即86H。
R5存储的是x-y的内容,x-y=-112,转换成二进制为1001 0000B(补码),即90H。
//x和y都是无符号整型,两数相减的过程是按照正常的相减方式的,如果看成有符号的整型,那么就是-20,存储的信息也和有符号整型存储的信息完全一致,但是这两者表示数据的方法不一样,这就导致了相同的信息表示出不同的数据,这里的112是有符号整型的说法罢了。
R6存储的是x+y的内容,x+y=380,转换成二进制为1 0111 1100B(前面的进位舍弃),即7CH。由于计算机字长为8位,所以无符号整数能表示的范围为0~255。而x+y=380,故溢出。
(2)执行上述程序段后,变量m和k1的值分别是多少?(用十进制表示)
m二进制表示为1000 0110B,由于m是int型,所以最高位为符号位,所以可以得出m的原码为:1111 1010(对10000110除符号位取反加1)(负数的原码与补码之间的转换都是除符号位取反加一),即-122。
同理n的二进制表示为1111 0110B,故n的原码为:1000 1010,转成十进制为-10。
所以k1=-122-(-10)=-112.
(3)上述程序段涉及带符号整数加/减、无符号整数加/减运算,这四种运算能否利用同一个加法器及辅助电路实现?简述理由。
可以利用同一个加法器及辅助电路实现。因为无符号整数都是以补码形式存储,所以运算规则都是一样的。
但是有一点需要考虑,由于无符号整数和有符号整数的表示范围是不一样的,所以需要设置不一样的溢出电路。
(4)计算机内部如何判断带符号整数加/减运算的结果是否发生溢出?上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?
三种方法可以判断溢出:
双符号位、最高位进位、符号相同操作数的运算后与原操作数的符号不同则溢出。
带符号整数只有k2会发生溢出。
分析:8位带符号整数的补码取值范围为:
-128~+127,而k2=m+n=-122-10=-132,超出范围,而k1=-112,在范围-128~+127之内。
2012
13.假定编译器规定 int 和 short 类型长度占 32 位和 16 位,执行下列 C 语言语句
unsigned short x = 65530;
unsigned int y = x;
得到 y 的机器数为
A. 0000 7FFA B. 0000 FFFA
C. FFFF 7FFA D. FFFF FFFA
答案:B
考查:无符号数,零扩展
x=65530,将其化为二进制 1111 1111 1111 1010,对应的16进制为FFFA,将其转化为32位的int为0000 FFFAH
14.float 类型(即 IEEE754 单精度浮点数格式)能表示的最大正整数是
A. 2126-2103
B. 2127-2104
C. 2127-2103
D.2128-2104
答案:D
考查: IEEE754 单精度浮点数格式
问题1:表示的为什么是正整数而不是小数?其实23位尾数是用来表示小数部分的,但是用阶码可以表示的指数是127,如果都用上是远大于小数部分的23位的。
问题2: 0.1111.....111111共23个1是怎么表示成1-2-23的呢?其实可以这样想如果给这个数加上一个0.000......000001那么就会变为1,而这个0.000......000001
就是2-23 !
15.某计算机存储器按字节编址,采用小端方式存放数据。假定编译器规定 int 和 short 型长度分别为 32 位和 16 位,并且数据按边界对齐存储。某 C 语言程序段如下:
struct{ int a; char b; short c; } record; record.a=273;
若 record 变量的首地址为 0Xc008,则地址0Xc008 中内容及 record.c 的地址分别为
A. 0x00、0xC00D C. 0x11、0xC00D
B. 0x00、0xC00E D. 0x11、0xC00E
答案:D
273=256+16+1=100010001B=0000 0111H
小端:高地址存高半字/字节;低地址存低半字/字节
什么是数据按边界对齐存储?
简单的说,对于int型而言,起始地址为4的倍数;对于char类型而言,起始地址为任意字节皆可;对于short类型而言,起始地址为2的倍数;对于结构体而言,起始地址结构体内类型最大的字节量的整数倍;
0xC008 中内容:0x11,record.c的地址:0xC00E
2013
13、某数采用 IEEE 754 单精度浮点数格式表示为 C640 0000H,则该数的值是()
A. -1.5*213 B. -1.5*212
C. -0.5*213 D. -0.5*212
答案: A
二进制为:1 100 0110 0 100 0000 0000 0000 0000 0000
符号位 1 负数
阶码 140-127=13
尾数 1.5
14.某字长为8位的计算机中,已知整型变量x、y的机器数分别为[x]补=11110100,[y]补=10110000。若整型变量 z=2*x+y/2,则 z 的机器数为
A. 1 1000000 B. 0 0100100
C. 1 0101010 D. 溢出
答案:A
解析:将 x 左移一位,得到 11101000
将 y 右移一位,得到 11011000
两数相加判断是否溢出可以使用双符号位法来判断,符号位和最高位进位都是1,不会造成溢出。
两个数的补码相加的机器数为 11000000
15.用海明码对长度为 8 位的数据进行检/纠错时,若能纠正一位错。则校验位数至少为
A. 2 B. 3 C. 4 D. 5
答案:C
考查:设校验位的位数为k,数据位的位数为n,应满足下述关系:2k≥n+k+1。n=8,当k=4时,24(=16)>8+4+1(=13),符合要求,校验位至少是4位。
2014
13. 若x=103,y=-25,则下列表达式采用8位定点补码运算实现时,会发生溢出的是
A x+y B -x+y C x-y D -x-y
答案:C
8位原码和反码能够表示数的范围是-127~127
8位补码能够表示数的范围是 -128~127
用补码表示时:
10000000-11111111表示-128到-1, 00000000-01111111表示0-127
补码的1111 1111转换成原码就是1000 0001,也就是-1。
在补码中用(-128)代替了(-0),所以补码的表示范围为: -128~127
注意:(-128)没有相对应的原码和反码, (-128) = (10000000),把10000000取反加1就是-128.
14. float型整数用IEEE754单精度浮点格式表示,假设两个float型变量x和y分别在32为寄存器f1和f2中,若(f1)=CC900000H, (f2)=B0C00000H,则x和y之间的关系为:
A x<y且符号相同 B x<y且符号不同
C x>y且符号相同 D x>y且符号不同
答案:A
解析:将f1 f2 分别展开,分别判断符号位和阶码
(f1)=CC900000H=1 100 1100 1 001 0000 0000 0000 0000 0000
(f2)=B0C00000H=1 011 0000 1 100 0000 0000 0000 0000 0000
在x,y同为负数的情况下,x的阶码为26,尾数为1.125;y的阶码为-30,尾数为1.5,则y>x
2015
13、由 3 个“1”和 5 个“0”组成的 8 位二进制补码,能表示的最小整数是()
A.-126 B.-125
C.-32 D.-3
答案B
二进制的补码表示。
对于这道题,我们应该怎样考虑?
选择题的话,可以投机一点,直接将选项转为补码就行了。
但要是在问答题中,由于最小的数肯定是负数,首先第一位就是1 ,又因为补码要取反,所以最小的数应该是 1,0000011.除开符号位取反加1后变成 1,1111101。这个数的十进制是-125
或者有这样一种说法,补码小这个数就小,补码大这个数就大!
补码:10000011
原码:11111101=-125
14.下列有关浮点数加减运算的叙述中,正确的()
Ⅰ.对阶操作不会引起阶码上溢或下溢
Ⅱ. 右规和尾数舍入都可能引起阶码上溢
Ⅲ.左规时可能引起阶码下溢
Ⅳ. 尾数溢出时结果不一定溢出
A.仅Ⅱ、Ⅲ B.仅Ⅰ、Ⅱ、Ⅳ
C.仅Ⅰ、Ⅲ、Ⅳ D.Ⅰ、Ⅱ、Ⅲ、Ⅳ
答案D
浮点数加减运算
1.对阶时,统一保留大的阶数,并不会造成阶码的上溢或者下溢。
2.右规和尾数舍入的过程会造成阶码的增加,因而有可能会引起阶码上溢。
3.左规的过程会造成阶码的减少,因而有可能会引起阶码下溢。
4.尾数溢出时,阶码不一定会溢出,结果也不一定能溢出。
补充:两个浮点规格化数相乘,是否可能需要右规?为什么?是否可能需要左规?为什么?其规格化次数可否确定?(6分)
答:不可能需要右规,可能需要左规,因为规格化的尾数是纯小数,两个纯小数相乘不会得到整数,但会变得更小,并且左规最多只需一次。