返回

计算机组成原理笔记|02运算方法和运算器

内容概要:数据在计算机中的存储和运算、相关习题


数据的表示方法

r进制数:基数r,每个数码位可能出现r种字符,逢r进1

r进制数$\longrightarrow$十进制:各数码位与位权的乘积之和

十进制$\longrightarrow$r进制:

  • 整数部分:除基取余法,先取得的“余”是整数的低位
  • 小数部分:乘基取整法,先取得的“整”是小数的高位

二进制$\longrightarrow$八进制:每3个二进制对应一个八进制位

二进制$\longrightarrow$十六进制:每4个二进制位对应一个十六进制位

注意“补位”

真值和机器数

  • 真值:现实中带正负号的数值
  • 机器数:把正负号数字化的数

ASCII码:通常用8bit表示一个字符,最高位都为0。共128个字符,0-31、127为控制/通信字符;32-126为可印刷字符。所有大写字母、所有小写字母、所有数字的编码都连续。

汉字:区位码94×94。国标码=区位码+2020H。机内码=国标码+8080H。

字符串:从低地址到高地址逐个字符存储,常采用‘\0’作为结尾标志。对于多字节的数据(如汉字),可采取大/小端存储模式。大端模式:将数据的最高有效字节存放在低地址单元中。小端模式:将数据的最高有效字节存放在高地址单元中。

组成奇偶校验码的基本方法:在n位有效信息位上增加一个二进制校验位,构成一个n+1位奇偶校验码。

奇校验:使n+1位的奇偶校验码中1的个数为奇数。 偶校验:使n+1位的奇偶校验码中1的个数为偶数。

定点数的表示

定点数:小数点的位置固定

Eg:996.007 ——常规计数

浮点数:小数点的位置不固定

Eg:9.96007×102 ——科学计数法

无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。

通常只有无符号整数,而没有无符号小数

真值0有+0和-0两种形式

反码:正数的反码=原码,负数的反码=数值位取反

补码:正数的补码=原码,负数的补码=反码末位+1(要考虑进位)。将负数补码转回原码的方法相同:尾数取反,末位+1。

技巧:由[x]快速求[-x]的方法

符号位、数值位全部取反,末位+1

移码:补码的基础上将符号位取反。移码=真值+偏置值

注意: 移码只能用于表示整数

原码和反码的真值0有两种表示;补码和移码的真值0只有一种表示形式。

小结

定点数移位运算

算术移位

  • 左移1位相当于×基数;右移1位相当于÷基数

  • 原码、反码:符号位不参与移位。左移、右移都补0

  • 补码:符号位不参与移位。左移补0、右移补符号数

    负数补码最右边的1及其右边与原码相同,最右边的1的左边与反码相同

逻辑移位

  • 左移右移都补0,移出的位舍弃

循环移位

  • 不带进位位:用移出的位补上空缺
  • 带进位位:移出的位放到进位位,原进位位补上空缺

注:由于原、反、补码位数限制,有时算术移位会有精度损失

定点数加减运算和溢出判断

定点数加减运算一律用补码

补码减法

  • 将减数x取负得[-x],转变为加法[A-B]=[A]+[-B],符号位参与运算

溢出判断(补码)

  • 上溢:正数+正数=负数
  • 下溢:负数+负数=正数
  • 采用双符号位,正数符号为00,负数符号为11。运算后若双符号位=01,则发生上溢;若双符号位=10,则发生下溢;若两个符号位相同则未发生溢出
  • 双符号位补码相加的结果,不论溢出与否,最高符号位始终指示正确的符号

定点数乘法运算

原码乘法

运算器实现原码一位乘法

符号位通过异或确定;数值部分通过被乘数和乘数绝对值的n轮加法、移位完成。根据当前乘数中参与运算的位(MQ最低位)确定(ACC)加什么。若当前运算位**=1,则(ACC)+[|x|];若=0,则(ACC)+0**。

手算模拟运算器实现原码一位乘法

补码乘法

运算器实现补码一位乘法

手算模拟运算器实现补码一位乘法

原码一位乘法与补码一位乘法对比

定点数除法运算

原码除法

恢复余数法

加减交替法(不恢复余数法)

恢复余数法:减除数,若余数为负数,商0,加除数,逻辑左移,减除数,得新余数;若余数为正数,商1,逻辑左移,减除数,得新余数

不恢复余数法:减除数,若余数为负数,商0,逻辑左移,加除数,得新 余数;若余数为正数,商1,逻辑左移,减除数,得新余数

补码除法

加减交替法

强制类型转换

补码位扩展

  • 定点小数:在最后补0
  • 定点整数:在前面补符号数(无符号数补0)

数据的存储和排列

大小端模式

边界对齐

浮点数的表示

表示

阶码+尾数

  • 尾数给出具体数值,阶码指明小数点前移、后移多少位
  • 阶码通常是用补码移码表示的定点整数
  • 尾数通常是用补码原码表示的定点小数
  • N=rE×M

规格化

  • 尾数的最高数值位必须是一个有效值(类比十进制科学计数法,通常我们会让数值部分最高位为非0)
  • 左规:数值位最高位无效时,通过尾数算术左移、阶码减1的方法处理,直到尾数最高数值位有效时停止
  • 右规:若采用双符号位表示尾数,则当运算后尾数“假溢出”时,可以通过尾数右移、阶码加1的方法处理
  • 原码表示的尾数规格化:尾数的最高数值位必须是1
  • 补码表示的尾数规格化:尾数最高数值位必须和尾数符号位相反

IEEE754规则

浮点数的运算

习题

1.已知[X],求[X/2]和[2X]

①[X]= 0.0110000 ; ②[X]=10011010

解析:

原码算术移位:符号位不变,数值部分左移或右移,移出的空位填 “0”。(左移一位相当于乘以2,右移一位相当于除以2)

① [X/2]0.0011000 [ 2X ]0.1100000

② [X/2]10001101 [ 2X ]10110100


2.设机器字长为8位,写出+0.375和-0.6875的二进制原码表示。

解析:

十进制$\longrightarrow$二进制原码:先转二进制再加符号位得原码

(+0.375)10 = (+0.011)2 [+0.011]0.011 = 0.0110000

(-0.6875)10 = (-0.1011)2 [-0.1011]1.1011 = 1.1011000


3.已知x,求x的补码[x]

①x=+0.1010110 ②x=-0.1010110 ③x=+1010110 ④x=-1010110

解析:

二进制真值$\longrightarrow$补码:先加符号位转成原码,然后转补码,正数不变,负数数值位取反加1

①[x]=0.1010110 ② [x]=1.0101010 ③ [x]=01010110 ④ [x]10101010


4.已知[x],求[2x]、[x/2]

(1) [x]=0.0101001, (2)[x]=11011010

解析:

补码算术移位:符号位不参与移位。左移补0、右移补符号位

(1) [2x]=0.1010010 [ x/2 ]= 0.0010100

(2) [2x]=10110100 [ x/2 ]=11101101


5.已知[x],求[-x]

(1) [x]=1.0011010 ,(2) [x]=10110010

解析:

[x]$\longleftrightarrow$[-x]:各位(含符号位)取反取反加1

(1) [-x]0.1100110

(2) [-x]01001110


6.将下列x的原码表示转化为补码表示。

[x]=0.1010110 [x]=1.1010110 [x]=01010110 [x]=11010110

解析:

原码$\longrightarrow$补码:正数不变,负数数值位取反加1

[x]=0.1010110 [x]=1.0101010 [x]=01010110 [x]=10101010


7.一个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

解析:

在C语言中,数据用补码存储。int型占4字节,32位;short型占2字节,16位。定点整数补码的位扩展是前面补符号数

[x]=01111111=0000,0000,0000,0000,0000,0000,0111,1111=0000007FH

[y]=10111=1111,1111,1111,0111=FFF7H

[z]=[x+y]=[x]+[y]=01111111+11110111=01110110=0000,0000,0000,0000,0000,0000,0111,0110 =00000076H

也可以直接127+(-9)=118=01110110=0000,0000,0000,0000,0000,0000,0111,0110 =00000076H

所以答案为D


8.假定编译器规定,int型占32位,short型占16位, 若有下列C语言语句:

unsigned short x=65530;

unsigned int y=x;

得到y的机器数为()

A. 0000 7FFAH

B. 0000 FFFAH

C. FFFF 7FFAH

D. FFFF FFFAH

解析:

在C语言中,数据用补码存储。无符号数与有符号数之间转换:不改变数据内容,改变解释方式。短整数$\longrightarrow$长整数:位扩展。无符号整数位扩展在前面补0。

216=65536,所以16个1为65535

short [x]=11111111,11111010

int [y]=00000000,00000000,11111111,11111010=0000FFFAH

所以答案为B


9.假定有4个整数用8位补码分别表示r1=FEH, r2=F2H,r3=90H,r4=F8H,若将运算结果存放在一个8位寄存器中,则下列运算会发生溢出的是 ()

A. r1×r2

B. r2×r3

C. r1×r4

D. r2×r4

解析:

用补码表示时8位寄存器所能表示的整数范围为-128到+127

r1=FEH=1111,1110 r1=1000,0010=-2

r2=F2H=1111,0010 r2=1000,1110=-14

r3=90H=1001,0000 r3=1111,0000=-112

r4=F8H=1111,1000 r4=1000,1000=-8

则r1×r2=28,r2×r3=1568,r1×r4=16,r2×r4=112,只有r2×r3结果溢出

所以答案为B


10.在32位计算机上,考虑以下C语言代码:

short si=-8196;

int i=si;

执行上述程序段后,i 的机器数表示为()

A. 0000 9FFCH

B. 0000 DFFCH

C. FFFF 9FFCH

D. FFFF DFFCH

解析:

在C语言中,数据用补码存储。int型占4字节,32位;short型占2字节,16位。短整数$\longrightarrow$长整数:位扩展。定点整数补码的位扩展是前面补符号数213=8192,所以第14位为1是8192

short [si] = 110,0000,0000,0100

short [si] = 101,1111,1111,1100=1101,1111,1111,1100

int[i]=1111,1111,1111,1111,1101,1111,1111,1100=FFFF DFFCH

所以答案为D


11.某机器字长8位,采用补码形式(其中1位为符号位),则机器数能表示的范围是______。

A. -127~127

B. -128~128

C. -128~127

D. -127~128

解析:

最大正数:0111,1111 = 127。正数原码=补码

最小负数:1000,0000 = -128。符号位同时也可以看做数字位即表示-128,转换成补码为1,0000,0000

验证:127(0111,1111)+1(0000,0001)=-128(1000 0000)

8位二进制的补码取值范围是-128-127

所以答案为C


12.8位补码定点整数1001 0101扩展成16位后的值用16进制表示为

A.0095H

B.9500H

C.FF95H

D.95FFH

解析:

考查补码定点整数位扩展:前面补符号数

1111,1111,1001,0101 = FF95H

所以答案为C


13.考虑以下C语言代码:

short si=-8196;

unsigned short usi=si;

执行上述程序段后,usi的值为多少()

A.8196

B.34572

C.57339

D.57340

解析:

在C语言中,数据用补码存储。short型占2字节,16位。无符号数与有符号数之间转换:不改变数据内容,改变解释方式。

213=8192,所以第14位为1代表8192,即

short [si]=110,0000,0000,0100

short [si]=101,1111,1111,1100=1101,1111,1111,1100

unsigned short [usi]=1101,1111,1111,1100

216=65536,所以16个1为65535,又213=8192,可得

[usi]=65535-8192-2-1=57340

所以答案为D


14.(统考2015-13) 由3个“1”和5个“0”组成的8位二进制补码, 能表示的最小整数是()

A.-126

B.-125

C.-32

D.-3

解析:

-128=1000,0000,转换成补码为1,0000,0000

-127=1111,1111,转换成补码为1000,0001

-126=1111,1110,转换成补码为1000,0010

……

由以上分析可得:只要3个“1”和5个“0”组成的补码最小,则转换成原码再转换成的十进制整数也最小,

补码:1000,0011,原码:1111,1101,转换成十进制即-125

所以答案为B


15.(统考2019-13)考虑以下C语言代码:

unsigned short usi=65535;

short si=usi;

执行上述程序段后,si的值为多少()

A.-1

B.-32767

C.-32768

D.-65535

解析:

在C语言中,数据用补码存储。short型占2字节,16位。无符号数与有符号数之间转换:不改变数据内容,改变解释方式。

216=65536

unsigned short [usi]=1111,1111,1111,1111

short [si]=1111,1111,1111,1111=-32767

[si]=1000,0000,0000,0001=-1

所以答案为A


16.将十进制真值(-127,-1,0,+1,+127)列表表示成二进制数及原码、反码、补码、移码值

解析:

二进制数 原码 反码 补码 移码
-127 -0111,1111 1111,1111 1000,0000 1000,0001 0000,0001
-1 -0000,0001 1000,0001 1111,1110 1111,1111 0111,1111
0000,0000 0000,0000 0000,0000 1000,0000
0 0000,0000
1000,0000 1111,1111 0000,0000 1000,0000
+1 +0000,0001 0000,0001 0000,0001 0000,0001 1000,0001
+127 +0111,1111 0111,1111 0111,1111 0111,1111 1111,1111

0在[x]和[x] 中有两种表示


17.已知x1 =-0.1110,x2=+0.1101,

求:[x1 ],[-x1], [x2],[-x2]

解析:

[x]$\longleftrightarrow$[-x]:各位(含符号位)取反取反加1

[x1]1.0010

[-x1]0.1110

[x2]0.1101

[-x2]1.0011


18.x=+0.1101,y=+0.0110,求x-y

解析:

[x]=0.1101

[y]=0.0110

[-y]=1.1010

[x-y]=[x]+[-y]=0.1101+1.1010=0.0111

所以x-y=+0.0111

算术运算验证:0.1101-0.0110=+0.0111


19.(1)x=+0.1100, y=+0.1000,求x+y

(2)x=-0.1100, y=-0.1000,求x+y

解析:

运算后若双符号位=01,则发生上溢;若双符号位=10,则发生下溢。双符号位补码相加的结果,不论溢出与否,最高符号位始终指示正确的符号。

(1)[x+y]=00.1100+00.1000=01.0100

双符号位出现“01”,表示上溢,即结果大于+1

(2)[x+y]=11.0100+11.1000=10,1100

双符号位出现“10”,表示下溢,即结果小于-1。


20.某字长8位的计算机中,已知整型变量x、y的机器数分别为[x]=11110100,[y]=10110000。若整型变量 z=2×x+y/2,则z的机器数为( )

A. 11000000

B. 00100100

C. 10101010

D. 溢出

解析:

补码:符号位不参与移位。左移补0、右移补符号位

[2X]=11101000

[y/2]=11011000

[Z]=[2X]+[y/2]=11101000+11011000=11000000

所以答案为A


21.若浮点数x的IEEE754标准存储格式为(41360000)16,求其浮点数的十进制数值。

解析:

由浮点数确定真值:

  1. 确定数符S、阶码E、尾数M的分布
  2. (-1)s×1.M×2E-127

IEEE754 32位标准:1+8+23

(41360000)16=(0100,0001,0011,0110,0000,0000,0000,0000)2

数符s=0,阶码E=(1000,0010)2=(130)10,尾数M=011011

X=(-1)s×1.M×2E-127=(-1)0×1.0111011×2130-127=+(1.011011)×23=+1011.011=(11.375)10


22.将(20.59375)10转换成IEEE754标准的32位浮点数的二进制存储格式。

解析:

由真值确定浮点数:

  1. 转换为二进制,移动小数点
  2. 确定数符S、阶码E、尾数M的分布

(20.59375)10=(10100.10011)2=(1.010010011)2×24

S=0,E=4+127=131=1000,0011,M=010010011

最后得到32位浮点数的二进制存储格式为:

0100,0001,1010,0100,1100,0000,0000,0000=(41A4C000)16


23.将5/32及-4120表示成IEEE754单精度浮点数格式,并用十六进制书写

解析:

由真值确定浮点数:

  1. 转换为二进制,移动小数点
  2. 确定数符S、阶码E、尾数M的分布

(1) (5/32)=(0.00101)2=(1.01)×2-3

S=0,E=-3+127=124=0111,1100,M=01

0011,1110,0010,0000,0000,0000,0000,0000=(3E200000)16

(2) (-4120)=(1000,0000,1100,0)=(1.000000011000)×212

S=1,E=12+127=139=10001011,M=000000011

1100,0101,1000,0000,1100,0000,0000,0000=C580C000H


24.将十六进制的IEEE754单精度浮点数42E48000转换成十进制数。

解析:

由浮点数确定真值:

  1. 确定数符S、阶码E、尾数M的分布
  2. (-1)s×1.M×2E-127

42E48000=0100,0010,1110,0100,1000,0000,0000,0000

S=0,E=1000,0101=133,M=1100,1001

(-1)0×(1.11001001)×26=1110010.01=114.25


25.设机器字长16位,定点表示,尾数15位,数符1位,问:

(1)定点原码整数表示时,最大正数是多少?最小负数是多少?

(2)定点原码小数表示时,最大正数是多少?最小负数是多少?

解析:

(1) 定点原码整数

最大正数:0111,1111,1111,1111=215-1=32767

最小负数:1111,1111,1111,1111=-(215-1)=-32767

(2)定点原码小数

最大正数:+0.111,1111,1111,1111,=1-2-15

最小负数:-0.111,1111,1111,1111,=-(1-2-15


26.假设由S,E,M三个域组成的一个32位二进制字所表示的非规格化浮点数x,真值表示为:

X=(-1)s×1.M×2E-128

其中数符S为1位,阶码E为8位,尾数M为23位。

请问:x所表示的最大正数、最小正数、最大负数、最小负数是多少?

解析:

最大正数:0111,1111,1111,1111,1111,1111,1111,1111

最小正数:0000,0000,0000,0000,0000,0000,0000,0000

最大负数:1000,0000,0000,0000,0000,0000,0000,0000

最小负数:1111,1111,1111,1111,1111,1111,1111,1111


27.float类型(即IEEE754单精度浮点数格式)能表示的最大正整数是()

A. 2126-2103

B. 2127-2104

C. 2127-2103

D. 2128-2104

解析:

0111,1111,0111,1111,1111,1111,1111,1111

E=254,e=254-127=127,M=111,1111,1111,1111,1111,1111=(1-2-23)10

(-1)0×(1.111……)×2127=[1+(1-2-23)]×2127=(2-2-23)×2127=2128-2104

所以答案为D


28.假定变量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和IV

解析:

由于(int)f=1,所以II错。IV的计算过程是先将f转换成双精度,然后加法运算,故得到 (d+f)-d双精度,而f为单精度,所以IV错

所以答案为B


29.float型数据通常用IEEE 754单精度浮点数格式表示。若编译器将float型变量x分配在一个32位浮点寄存器FR1中,且x = -8.25,则FR1的内容是()

A. C104 0000H

B. C242 0000H

C. C184 0000H

D. C1C2 0000H

解析:

由真值确定浮点数:

  1. 转换为二进制,移动小数点
  2. 确定数符S、阶码E、尾数M的分布

(-8.25)10=(1000.01)2=(1.00001×23)

S=1,E=3+127=130=1000,0010,M=00001

1100,0001,0000,0100,0000,0000,0000,000=C104 0000H

所以答案为A


30.某数采用IEEE单精度浮点数格式表示为 C640 0000H,则该数的值是( )

A. -1.5×213

B. -1.5×212

C. -0.5×213

D. -0.5×212

解析:

由浮点数确定真值:

  1. 确定数符S、阶码E、尾数M的分布
  2. (-1)s×1.M×2E-127

C640 0000=1100,0110,0100,0000,0000,0000,0000,0000

S=1,E=1000,1100=140,e=E-127=13,M=1

(-1)1×(1.1)×213=-1.5×213

所以答案为A


31.设x=2010×0.11011011,y=2100×(-0.10101100),求 x+y。

解析:

浮点加减运算操作:

  1. 求阶差并对阶(小阶向大阶)
  2. 尾数进行加或减运算
  3. 结果规格化
  4. 舍入处理
  5. 判溢出

注:

  1. 两数均以补码表示,阶码采用双符号位,尾数采用单符号位
  2. 补码算术右移:补符号数;补码算术左移:补0
  3. 补码表示的尾数规格化:尾数最高数值位必须和尾数符号位相反

x:[Ex]=00010,[Mx]=0.11011011

y:[Ey]=00100,[My]=1.01010100

求阶差:△E = Ey - Ex = [ Ey ] + [ - Ex ] = 00100 + 11110 = 00010=+2

对阶后:[Ex]=00100,[Mx]=0.00110110(11),其中(11)表示[Mx]右移2位后移出的最低两位数

尾数加:[Mx] + [My] = 0.00110110(11) + 1.01010100 = 1.10001010(11)

规格化:左规1.10001010(11) = 1.00010101(10),E=00011

0舍1入:1.00010101 + 0.00000001 = 1.00010110

判溢出:阶码符号位为00,不溢出,故得最终结果为

x+y=2011×(-0.11101010)


32.在浮点数原码运算时, 判定结果为规格化数的条件是 。

A. 阶的符号位与尾数的符号位不同

B. 尾数的符号位与最高数值位相同

C. 尾数的符号位与最高数值位不同

D. 尾数的最高数值位为1

解析:

原码表示的尾数规格化:尾数的最高数值位必须是1

所以答案为D


33.若浮点数用补码表示,则判断运算结果是否为规格化数的方法是

A. 阶符与数符相同为规格化数

B. 阶符与数符相异为规格化数

C. 数符与尾数小数点后第一位数字相异为规格化数

D. 数符与尾数小数点后第一位数字相同为规格化数

解析:

补码表示的尾数规格化:尾数最高数值位必须和尾数符号位相反

所以答案为C


34.浮点数加减运算过程一般包括对阶、尾数运算、规格化、舍入和判溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为5位和7位(均含2位符号位)。若有两个数X=27×29/32,Y=25×5/8,则用浮点加法计算X+Y的最终结果是()

A. 00111 1100010

B. 00111 0100010

C. 01000 0010001

D. 发生溢出

解析:

浮点加减运算操作:

  1. 求阶差并对阶(小阶向大阶)
  2. 尾数进行加或减运算
  3. 结果规格化
  4. 舍入处理
  5. 判溢出

[Ex]=00111,[Mx]=00.11101

[Ey]=00101,[My]=00.10100

阶差=2,y向x看齐,[E]=00111,[My]=00.00101(00)

[Mx] + [My]= 00.11101 + 00.00101(00) = 01.00010

发生尾数上溢,但是阶码00111,已经达到最大,尾数无法移位调整,发生无法拯救的尾数上溢

所以答案为D

选择题中简便方法:

在十进制中,X=27×29/32,Y=25×5/8=27×5/32

X+Y=27×(29/32+5/32),尾数大于1,发生尾数上溢,阶码数值位只有3位,最大为7,尾数无法移位调整,发生无法拯救的尾数上溢

所以答案为D


35.下列有关浮点数加减运算的叙述中,正确的是( )

Ⅰ.对阶操作不会引起阶码的上溢或下溢

Ⅱ.右规和尾数舍入都可能引起阶码的上溢

Ⅲ.左规时可能引起阶码的下溢

Ⅳ.尾数溢出时结果不一定溢出

A. 仅Ⅱ、Ⅲ

B. 仅Ⅰ、Ⅱ、Ⅳ

C. 仅Ⅰ、Ⅲ、Ⅳ

D. Ⅰ、Ⅱ、Ⅲ、Ⅳ

解析:

对阶是较小的阶码对齐至较大的阶码,Ⅰ 正确。

右规和尾数舍入过程,阶码加1而可能上溢,Ⅱ 正确,

同理 Ⅲ也正确。

尾数溢出时可能仅产生误差,结果不一定溢出,Ⅳ 正确。

所以答案为D

Built with Hugo
Theme Stack designed by Jimmy