一.错题回顾
1. 8位原码能表示的不同数据有( )个。
A. 15 B. 16 C.255 D.256
解析:C。8个二进制位有2^8= 256种不同表示。原码中0有两种表示,因此原码能表示的不同数据为2^8-1=255个。由于0在反码中也有两种表示,因此若题目改为反码,答案也为选项C。0在补码与移码中只有一种表示,因此题目若改为补码或移码,答案为选项D。
2.下列关于补码和移码关系的叙述中,( )是不正确的。
A.相同位数的补码和移码表示具有相同的数据表示范围
B.零的补码和移码表示相同
C.同一个数的补码和移码表示,其数值部分相同,而符号相反
D.一般用移码表示浮点数的阶,而补码表示定点整数
解析:B。以机器字长5位为例,[0]补= 00000,[0]移 =2^4 +0= 10000, [0]补≠ [0]移,表示不相同,但在补码或移码中的表示形式是唯一的。
3.若[x]补= 1,x1x2x3x4x5x6,其中x取0或1,若要x>-32,应当满足( )
A. x1为0,其他各位任意
B. x1为1,其他各位任意
C. x1为1,其他各位至少有一位为1
D. x1为0,其他各位至少有一位为1
解析:C。[x]补的符号位为1,所以x一定是负数。绝对值越小,数值越大,所以要满足x> -32,则x的绝对值必须小于32。因此,x1为1, X2..……x6中至少有一位为1;这样,各位取反末尾加1后,
x1一定为0,x2.……x6中至少有一位为1, 使得x的绝对值保证小于32。
4.设x为真值,x*为其绝对值,满足[-x*]补=[-x]补, 当且仅当( )
A. x任意
B. x为正数
C. x为负数
D.以上说法都不对
解析:D。当x为0或为正数时,满足[-x*]补=[-x]补,B为充分条件,因此选项B错误。而x为负数时,-x为正数,而-x*为负数,补码的表示是唯一的, 显然二者不等,因此选项C错误。
5.一个8位寄存器内的数值为11001010,进位标志寄存器C为0,若将此8位寄存器循环左移(不带进位位) 1位,则该8位寄存器和标志寄存器内的数值分别为( )
A. 10010100 1 B. 10010101 0
C. 10010101 1 D. 10010100 0
解析:C。不带进位位的循环左移将最高位进入最低位和标志寄存器 C 位。
6.关于模4补码,下列说法正确的是( )
A.模4朴码和模2补码不同,它更容易检查乘除运算中的温出问题
B.电每个模4补码存储时只需一个符号位
C.存储每个模4补码需要两个符号位
D.模4补码,在算术与逻辑部件中为一个符号位
解析:B。模4补码(双符号位法),具有模2补码的全部优点且更容易检查加减运算中的溢出问题,选项A错误。需要注意的是,存储模4补码仅需一个符号位,因为任何一个正确的数值,模4补码的两个符号位总是相同的,选项B正确。只在把两个模4补码的数送往ALU完成加减运算时,才把每个数的符号位的值同时送到ALU的双符号位中,即只在ALU中采用双符号位,选项C、D错误。
7.实现N位(不包括符号位)补码一位乘时,乘积为( )位。
A. N B. N+1 C. 2N D. 2N+1
解析:D。补码一位乘法运算过程中一共向右移位N次,加上原先的N位,一共是 2N位数值位,因乘积结果需加上符号位,因此共 2N+ 1位。
8.下列关于 补码除法的说法中正确的是( )
A.补码不恢复除法中,够减商0,不够减商1
B.补码不恢复余数除法中,异号相除时,够减商0,不够减商1
C.补码不恢复除法中,够减商1,不够减商0
D.以上都不对
解析:B。补码除法(不恢复余数法),异号相除是看够不够减,然后上商,够减商0,不够减商1。
9.下列关于各种移位的说法正确的是( )
I. 假设机器数采用反码表示,当机器数为负时,左移时最高数位丢),结果出错;右时最低数位丢0,影响精度
II. 在算术移位的情况下,补码左移(不丢失精度)的前提条件是其原最高有效位与原符号位要相同
III.在算术移位的情况下, 双符号位的移位操作只有低符号位需要参加移位操作
A. I、III B.仅II C.只有I D.I 、I、III
解析:D。
I. 负数的反码除符号位外其他位与负数的原码相反, 不难推出I正确。 如5位反码 10010表示-13,右移1位变成11001为6,影响精度:左移1位变成10101为-10,数据丢失。
II.补码表示时,正数的符号位为0.左移最高位为0时,数据不会丢失:负数的符号位为,左移最高位为1时,数据不会丢失。因此左移移走的最高位要与符号位相同。
III.双符号位的最高符号位代表真正的符号,而低位符号位用于参与移位操作以判断是否发生溢出,如01表示结果正溢出,10表示结果负溢出。
I、II、III都正确。
10.某计算机字长为8位,CPU中有一个8位加法器,已知无符号数x=69,y=38,如果在该加法器中计算 x-y ,则加法器的两个输入端信息和输入的低位进位信息分别为( )
A.01000101 00100110 0
B.01000101 11011001 1
C.0100 0101 11011010 0
D.0100 0101 11011010 1
解析:D。不管是补码减法,还是无符号数减法,都是用被减数加上减数的负数的补码来实现的。根据求补公式,减数y的负数的补码[-y]补=Y+1,因此,在加法器的Y'输入端用一个反向器实现,并用控制端Sub控制多路选择器是否将y的各位取反后,输入Y'端,同时将Sub作为低位进位送到加法器。当Sub为1时,做减法,Sub=1控制将Y输入到加法器Y'端,即实现“各位取反”功能;同时将Sub=1作为低位进位送到加法器,实现“末位加1”功能。69的二进制数为01000101; 38的二进制数为01001100 ,各位取反得1101 1001 做减法时, 低位进位为Sub,即为1。
注意:若仅记忆补码加减运算的过程,而未掌握加法电路的原理,则本题易误选选项D。
11.假定有4个整数用8住补码分别表示: r1=FEH、r2=F2H、r3=90H、r4=F8H, 若将运算结果存放在一个8位寄存器中,则下列运算会发生溢出的是( )
A. r1*r2
B. r2*r3
C. r1*r4
D. r2*r4
解析:B。本题的真正意图是考查补码的表示范围,采用补码乘法规则计算出4个选项是费力不讨好的做法,且极易出错。8位补码所能表示的整数范围为128~+127. 将4个数全部转换为t进制数:
r=-2,12=-14, 3=-112, r4=-8, 得r2*r3=1568, 远超出了表示范围,发生溢出。
12.某计算机存储器按字节编址,采用小端方式存放数据。假定编译器规定 int 和 short 型长度分别为32位和16位,并且数据按边界对齐存储。某C语言程序段如下:
struct{ int a; char b; short c; }record; record.a=273;
若rcord变量的首地址为0xC008,地址0xC008中的内容及recorde.c的地址分别为( )
A.0X00 0xC00D B. 0X00 0xC00E C. 0x11 0xC00D D. 0x11 0xC00E
解析:D。尽管record大小为7B (成员a有4B,成员b有1B,成员c有2B),由于数据按边界对齐方式存储,因此record共占用8B。 record.a 的十六进制表示为00001110,由于采用小端方式存放数据,因此地址0xC008中的内容应为低字节0x11; record.b只占1B,后面的1B留空; record.c占2B,因此其地址为0xC00E。
13. 若x=103,y=-25, 则下列表达式采用8位定点补码达算实现时,会发生溢出的是( )
A. x+y B. -x+y C. x-y D. -x-y
解析:C。该题可以使用双符号位进行补码加减运算,但是判断溢出的题同时也有其他解法。8位定点补码表示的数据范围为128~127,若运算结果超出这个范围则会溢出,A选项x+y=103-25=78,符合范围,A排除; B选项x+y=-103- 25=-128,符合范围,B排除; D选项x-y=-103 + 25= -78,符合范围,D排除; C选项x-y=103 +25= 128,超过127,选择选项C。
14.减法指令“sub R1, R2,R3"的功能为(R1)-(R2)——> R3”,该指令执行后将生成进位/借位标志CF和溢出标志OF.。若(R1)= FFFF FFFFH, (R2) = FEFF FFF0H,则该减法指令执行后,CF与OF分别为( )
A. CF=0,OF=0
B. CF=1,OF=0
C. CF=0,OF=1
D. CF=1,OF=1
解析:A。[x]补- [y]补=[x]补 + [-y]补, [-R2]补 = 0000 0010H很明显[R1]补 + [-R2]补的最高位进位和符号位进位都是1 (当最高位进位和符号位进位的值不相同时才产生溢出,可以判断溢出标志OF为0。同时,减法操作只需判断借位标志,R1 大于R2,所以借位标志为0,综上答案是选项A。
15.有实现X的两个C语言函数如下:
unsigned umul(unsigned x, unsigned y) { return x*y; } int imul(int x,int y) { return x*y; }
假定某计算机M中的ALU只能进行加减运算和逻辑运算,请回答下列问题。
1)若M的指令系统中没有乘法指令, 但有加法、减法和位移等指令,则在M上也能实现上述两个函数中的乘法运算,为什么?
2)若M的指令系统中有乘法指令,则基于ALU、位移器、寄存器及相应控制逻辑实现乘法指令时,控制逻辑的作用是什么?
3)针对以下三种情况: a)没有乘法指令; b)有使用ALU和位移器实现的乘法指令;c)有使用阵列乘法器实现的乘法指令,函数umul()在哪种情况下执行的时间最长?在哪种情况下执行的时间最短?说明理由。
4) n位整数乘法指令可保存2n位乘积,当仅取低n位作为乘积时,其结果可能会发生溢出。n=32、x=2^31-1、y=2时,带符号整数乘法指令和无符号整数乘法指令得到的xy的2n位乘积分别是什么(用十六进制表示)?此时函数umul()和imul()的返回结果是否溢出?对于无符号整数乘法运算,当仅取乘积的低n位作为乘法结果时,如何用2n位乘积进行溢出判断?
解:1)乘法运算可以通过加法和移位来实现。编译器可以将乘法运算转换为一个循环代码段,在循环代码段中通过比较、加法和移位等指令实现乘法运算。
2)控制逻辑的作用是控制循环次数,控制加法和移位操作。
3) a最长,c最短。对于a, 需要用循环程序段实现乘法操作,因而需要反复执行很多条指令,而每条指令都需要取指令、译码、取数、执行并保存结果,所以执行时间很长;对于b和c,都只需用一条乘法指令实现乘法操作,不过b中的乘法指令需要多个时钟周期才能完成,而c中的乘法指令可在一个时钟周期内完成,所以c的执行时间最短。
4)当n=32, x=2^31- 1,y= 2时,带符号整数和无符号整数乘法指令得到的64位乘积都是0000 0000 FFFF FFFEH。int 型的表示范围为[ -2^31,2^31-1],故函数imul0的结果溢出:unsigned int型的表示范围为[0, 2^32-1]小,故函数umul0的结果不溢出。对于无符号整数乘法,若乘积高n位全为0,即使低n位全为1也正好是2^32-1,不溢出,否则溢出。
二.基础知识梳理
1.机器数的定点表示
定点表示法用来表示定点小数和定点整数。
1)定点小数。定点小数是纯小数,约定小数点位置在符号位之后、有效数值部分最高位之前。
2)定点整数。定点整数是纯整数,约定小数点位置在有效数值部分最低位之后。
2.原码、反码、补码、移码
2.1原码
定点整数
个人理解:整数的二进制表示,最高位为符号位。
例子:x1=+13 x2=-9
则 [x1]原=0000 1101;[x2]原=1000 1001。
定点小数
个人理解:小数点右边用二进制表示,左边为符号位。
例子:x1=+0.1101 x2=-0.1101
则 [x1]原=0.1101000;[x2]原=1.1101000。
注意:真值0的原码表示有正零和负零两种形式,即[+0]原=0000 0000; [-0]=1000 0000。
2.2反码
正数
个人理解:正数反码=原码。
例子:x1=+13 x2=+0.1101
则 [x1]反=0000 1101;[x2]反=0.1101000。
负数
个人理解:在原码基础上,除符号位以外全部取反。
例子:x1=-9 x2=-0.1101
则[x1]反=1111 0110;[x2]反=1.0010111。
2.3 补码
正数
个人理解:正数补码=原码=反码。
例子:x1=+13 x2=+0.1101
则 [x1]反=0000 1101;[x2]反=0.1101000。
负数
个人理解:在反码基础上,进行末尾加1运算;在原码基础上,先除符号位以外取反再末位加1。
例子:x1=-9 x2=-0.1101
则[x1]补=1111 0111;[x2]反=1.0011000。
注意:零的补码表示是唯一的,即[+0]补=[-0]补=0000 0000。
2.4 移码
正数
个人理解:在补码基础上符号位取反。
例子:x1=+13
则 [x1]移=1000 1101。
负数
个人理解:在补码基础上符号位取反。
例子:x1=-9
则[x1]移=0111 0111。
注意:移码常用来表示浮点数的阶码,它只能表示整数。
理解:如果你去看移码的定义,会发现很复杂,但其实它相比补码的规律就是符号位取反。
3.整数的表示
3.1无符号数的表示
当一个编码的全部二进制位均为数值位而没有符号位时,该编码表示就是无符号整数,也直
接称为无符号数。此时,默认数的符号为正。由于无符号整数省略了一位符号位,所以在字长相
同的情况下,它能表示的最大数比带符号整数能表示的大。例如8位无符号整数,对应的表示范围为0~2^8-1,即最大数为255, 而8位带符号整数的最大数是127。一般在 全部是正数运算且不出现负值结果的场合下,使用无符号整数表示。例如,可用无符
号整数进行地址运算,或用它来表示指针。
3.2 带符号数的表示
将符号数值化,并将符号位放在有效数字的前面,就组成了带符号整数。虽然前面介绍的原
码、补码、反码和移码都可以用来表示带符号整数,但补码表示有其明显的优势:
①与原码和反码相比,0的补码表示唯一。
②与原码和移码相比,补码运算规则比较简单,且符号位可以和数值位一-起参加运算。
③与原码和反码相比,补码比原码和反码多表示一个最小负数。
计算机中的带符号整数都用补码表示,故n位带符号整数的表示范围是-2^(n-1)~-2^(n-1)- 1。
补充:在考研计算机组成原理中,凡是用原码、反码、补码、移码表示的数进行运算,如无特殊说明,其表示的都是带符号数。
4.基本运算部件
在计算机中,运算器由算术逻辑单元(Arithmetic Logic Unit, ALU)、移位器、状态寄存器、通用客存器组等组成。 运算器的基本功能包括加、减、乘、除四则运算, 与、或、非、异或等逻辑运算,以及移位、求补等操作。ALU的核心部件是(带标志)加法器。
这里更详细的涉及到一位全加器、串行进位加法器、并行进位加法器、带标志加法器、算法逻辑单元(ALU)的逻辑电路,就不详细说明。在逻辑电路中,需要知道:ALU是一种功能较强的组合逻辑电路,它能进行多种算术运算和逻辑运算。另外补充了解一个设备:MUX是多路选择开关(多路选择器),它从多个输入信号中选择一个送到输出端。
三.运算
首先我们需要了解定点数的运算分为算术运算和逻辑运算,算术运算即所谓的加减乘除,而今天的逻辑运算主要了解的是其中的移位运算。其中移位运算主要包括算术移位、逻辑移位、循环移位。
1.移位运算
1.1算术移位
算术移位的对象是有符号数,在移位过程中符号位保持不变。
1.2逻辑移位
逻辑移位将操作数视为无符号数。
移位规则:无论逻辑左移还是右移,都添0补充。
1.3循环移位
循环移位分为带进位标志位CF的循环移位(大循环)和不带进位标志位的循环移位(小循环)。
循环移位的主要特点是,移出的数位又被移入数据中,而是否带进位则要看是否将进位加入循环位移。带进位位的循环左移,就是数据位连同进位标志一起左移,数据的最高位移入进位标志CF,而进位位则依次移入数据的最低位。不带进位位的循环左移就是数据的最高位同时进入进位标志位CF和移入数据的最低位。循环移位操作特别适合将数据的低字节数据和高字节数据互换。
2.加减运算
2.1原码加减
运算规则:
加法规则:先判别符号位,若相同,则绝对值相加,结果符号位不变;若不同,则做减法,绝对值大的数减去绝对值小的数,结果符号位与绝对值大的数相同。
减法规则:两个原码表示的数相减,首先将减数符号位取反,然后将被减数与符号位取反的减数按原码加法进行运算。
个人理解:
加法:符号位相同,直接计算;符号问不同,真值计算。
减法:[A]原-[B]原=[A]原+[-B]原
注意:运算时注意机器字长,当左边位出现溢出时,将溢出位丢掉。
2.2补码加减
公式:
[A+B]补 = [A]补 + [B]补
[ A-B]补 = [A]补 + [-B]补
补码运算的特点如下:
1)按二进制运算规则运算,逢二进-。
2) 若做加法,两数的补码直接相加;若做减法,则将被减数与减数的机器负数相加。
3)符号位与数值位一 起参与运算,加、减运算结果的符号位也在运算中直接得出。
4)最终运算结果的高位丢弃,保留n+1位,运算结果亦为补码。
例子:设机器字长为8位(含1位符号位),A=15, B=24, 求[A + B]补和[A-B]补。
解析:A= +15= +001111, B= +24 = +0011000; 得[A]补 = 0000 1111, [B]补 = 0001 1000。
求得[-B]补= 1110 1000。所以
[A + B]补= 0000 1111 + 0001 1000= 0010 0111, 符号位为0,对应真值为+39。
[A - B]补=[A]补 + [ -B]补= 0000 1111+ 1110 1000= 1111 0111, 符号位为1,对应真值为-9。
2.3溢出方法判别
仅当两个符号相同的数相加或两个符号相异的数相减才可能产生溢出,如两个正教相加,而结果的符号位却为1(结果为负);一个负数减去一个正数,结果的符号位却为0 (结果为正)。
补码定点数加减运算溢出判断的方法有3种:
采用一位符号位
由于减法运算在机器中是用加法器实现的,因此无论是加法还是减法,只要参加操作的两个数符号相同,结果又与原操作数符号不同,则表示结果溢出。
采用双符号位(模4补码)
运算结果的两个符号位S1S2的各种情况如下:
1. S1S2=00,表示结果为正数,无溢出。
2. S1S2=01,表示结果正溢出。
3. S1S2=10,表示结果负溢出。
4. S1S2=11,表示结果为符数,无溢出。
运算结果的两个符号位S1S2相同,表示未溢出;
运算结果的两个符号位S1S2不同,表示溢出,此时最高符号位代表真正的符号。
采用一位符号位根据数据位的进位情况判断溢出
若符号位的进位C1与最高数位的进位C2相同,则说明没溢出,否则表示发生溢出。
3.乘法运算
乘法运算右累加和右移操作实现,可分为原码一位乘法和补码一位乘法。
3.1原码一位乘法
原码一位乘法的特点是符号位与数值位是分开求的,乘积符号由两个数的符号位“异或”形成, 而乘积的数值部分则是两个数的绝对值相乘之积。
设[X]原= =X0·X1X2……Xn,[Y]原 =Y0·Y1Y2……Yn,则运算规则(步骤)如下:
被乘数和乘数均取绝对值参加运算,看作无符号数,符号位为 X0 ^ Y0;
部分积是乘法过程的中间结果。乘数的每一位yi;乘以被乘数得X*yi后,将该结果与前面所得的结果累加,就是部分积,初值为0。
从乘数的最低位yn开始判断:若yn=1, 则部分积加上被乘数 x 的绝对值,然后右移一位;若yn=0, 则部分积加上0,然后右移一位。
重复步骤3,判断n次。
由于参与运算的是两个数的绝对值,因此运算过程中的右移操作均为逻辑右移。
注意:考虑到运算过程中部分租和乘数做加法时,可能出现部分积大于1的情况(产生进位),但此刻并非溢出, 所以部分积和被乘数取双符号位。
例子:设 x = -0.1101,y = 0.1011,采用原码一位乘法求 x*y。
3.2补码一位乘法(Booth算法)
这是一种有符号数的乘法,采用相加和相减操作计算补码数据的乘积。
设[x]补=x0·x1x2……xn, [Y]补=y0·y1y2……yn,则运算规则(步骤)如下:
①符号位参与运算,运算的数均以补码表示。
②被乘数一般取双符号位参与运算,部分积取双符号位,初值为0,乘数取单符号位。
③乘数末位增设附加位yn+1,初值为0。
④根据(yn,yn+1)的取值来确定操作,见表2.2。
⑤移位按补码右移规则进行。
⑥按照上述算法进行n+1步操作,但第n+1步不再移位(共进行n+ 1次累加和n次右移),仅根据yn 与Yn+1 的比较结果做相应的运算。
例子:设 x =-0.1101, y=0.1011,采用Booth算法求 x*y。
4.除法运算
除法运算可转换成“累加一左移”(逻辑左移),分为原码除法和补码除法。
4.1原码除法运算(不恢复余数法)
原码不恢复余数法也称原码加减交替除法。特点是商符和商值是分开进行的,减法操作用补码加法实现,商符由两个操作数的符号位“异或”形成。求商值的规则如下。
设被除数[X]原=x0·x1x2……xn,除数[Y]原=y0·y1y2……yn, 则
①商的符号: Q =x ^ y。
②商的数值: |Q| =|x| \ |y|。
求|Q|的不恢复余数法运算规则如下。
①先用被除数减去除数( |x|-|y|=|X|+(-|Y|)=X1+[-|Y|]补),当余数为正时,商上1,余数和商左移一位,再减去除数;当余数为负时,商上0,余数和商左移一位,再加上除数。
②当第n+ 1步余数为负时,需加上 |y| 得到第n+ 1步正确的余数(余数与被除数同号)。
例子:设x=0.1011,y=0.1101,采用原码加减交替除法求x/y。
4.2补码除法运算(加减交替法)
补码一 位除法的特点是,符号位与数值位一起参加运算, 商符自然形成。除法第一步根据被
数和除数的符号决定是做加法还是减法;上商的原则根据余数和除数的符号位共同决定,同号
商“1”,异号上商“0";最后一步商恒置“1”。
加减交替法的规则如下:
①符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示。
②若被除数与除数同号,则被除数减去除数;若被除数与除数异号,则被除数加上除数。
③若余数与除数同号,则商上1,余数左移位减去除数;若余数与除数异号,则3数,
④重复执行第③步操作n次。
⑤若对商的精度没有特殊要求,则一般采用“末位恒置1”法。
例子:设x= 0.1000, y= -0.1011, 采用补码加减交替法求x/y。
四.常见问题和易混淆知识点
什么称为无符号整数的“溢出”?
解:对于无符号定点整数来说,若寄存器位数不够,则计算机运算过程中一般保留低n位,舍弃
高位。这样,会产生以下两种结果。
①保留的低n位数不能正确表示运算结果。在这种情况下,意味着运算的结果超出了计算
机所能表达的范围,有效数值进到了第n+1位,称此时发生了“溢出”现象。
②保留的低n位数能正确表达计算结果,即高位的舍去并不影响其运算结果。
五.作业
计算机在字长足够的情况下能够精确地表示每个数吗?若不能,请举例。
解:计算机采用二进制来表示数据,在字长足够时,可以表示任何一个整数。 而二进制表示小数
时只能够用1/(2^n)的和的任意组合表示,即使字长很长,也不可能精确表示出所有小数,只能无
限接近。例如0.1就无法用二进制精确地表示。