计算机中的移位是数据相对于小数点移位(左移或右移),数据移动,小数点位置不发生变化
左移:数值绝对值变为原来2倍
右移:数值绝对值变为原来1/2倍
左移1位:机器数对应真值的绝对值变为原来2倍
右移1位:机器数对应真值的绝对值变为原来1/2倍
负数:数值部分和真值相同
逻辑左移 低位添0,高位移丢
逻辑右移 高位添0,低位移丢
逻辑左移 所有位都参加移位操作 高位0移丢,最低位添0 :
算术左移 第一个0表示符号位,这个数为正数,符号位不参与移位,移位的是后面的数据
逻辑右移 所有位都参加移位操作 空出的最高位补0,最低位丢弃
算术右移 最高位不参与移位,符号位,表示负数,右移左侧空出最高位添1,右侧0丢弃
补码运算:连同符号位一起相加,符号位产生的进位自然丢掉
1.设机器数字长为8位,(含1位符号位),A=15,B=24,用补码求A-B
(1)一位符号位判溢出
参加操作的两个数(减法时即为被减数和“求补”以后的减数)符号相同,其结果的符号与原操作数的符号不同,即为溢出。
两个正数相加,如果补码最后得到的结果为负数,那就说明发生了溢出错误,但是如果有效位有进位的话,会进到数值位去,使得相加后的符号位变为1,这样两个正数相加就变成了负数,显然是错误的,发生率溢出。
两个负数相加,本身补码的符号位都为1,符号位肯定会发生进位,并且最高位丢弃,如果此时负数的有效位部分没有进位,那么两个负数相加后的符号位就变成了0,显然发生了溢出。
最高有效位进位:数值的最高位在运算时产生的进位
符号位产生的进位进行异或运算
若得到得结果为1,两个进位不相同,可判断出发生溢出
逗号后面进了1,为最高有效位的进位,它与数值为的最高位1异或得结果为0,表示没有发生溢出
(2)两位符号位判断溢出
假设做存小数定点机中的加法运算,将补码的mod由2改为4
这种形式的补码,即使X>0,也要在小数点前面加2位,小数点数值部分设置两位符号位,小数点数值部分和X相同,(并不是说补码和在纸上写的真值的形式完全相同)
同样如果是负数,采用4位mod,经过这种变换,数值的数字的符号位,就变为2个1,然后是小数点,后面是每位取反,末尾加1
若为整数,原来用2^(n+1)作为整数的mod
若采用双符号位,mod要变为2^(n+2)
若为整数形式,求补码mod,符号位是m位;
若为正数m个0,后面是数值部分
若为负数m个1,后面的数值部分要每位取反末尾加1
所以可以推广为以4为mod,以8为mod
判断最高有效位与符号位是否相等来判断是否溢出
前面的符号位的第一个符号位,是真正的符号位,第二个符号位,是运算时数值发生溢出产生的符号位
所以最高符号位代表真正的符号位
被乘数逐步左移,其数值是本身还是0由乘数的某一位决定的;
乘法运算可用加和移位实现
n=4,加4次,移4次
由乘数的末尾决定被乘数是否与原部分积相加,然后->1位形成新的部分积1,同时乘数->1位(末尾丢掉),空出高位存放部分积的低位。
被乘数只与部分积的高位相加
(1)原码1位乘运算规则
用移位的次数判断乘法是否结束
1.上商后补0,和右移1位的除数0.01101做比较,比现在加0后的被除数小,上1,减掉右移1位的除数;
2.添0,和右移2位的除数做比较,小数后有2个0,显然比现在的余数小,上商1,减掉右移2位的除数,得到新余数;
3.添0,把新余数和右移3位的除数0.0001101做比较,比现在的余数大,上商0,继续给新的余数添0,和右移4位的除数0.做比较,比新余数小,上商1,减法得到余数
当商的位数和除数的位数一样时停止
商的符号位单独处理x与y异或运算
数值部分为绝对值相除x^* / y^*
被除数不等于0,除数不能为0
做减法目的:试探上商为1还是0
一共进行了5次上商,4次移位,第一次上商判断是否发生溢出:
若在小数定点机中,第一次上商上1,说明发生溢出,商的值大于1,所有只能表示绝对值小于1的数
余数为负,上商0,恢复余数
和传统除法的区别:余数左移而不是原来的除数右移;由于先做的是减法操作,上商0的时候,不应该做减法,所以要恢复余数,恢复余数之后,再把余数左移1位,它的值扩大2倍;和除数再进行比较,以决定下一个上商为0或1,循环
(2)不恢复余数法(加减交替法)
符号位x=1与y=1异或得到为0
PS:csdn博客有彩色重点标记,看起来更加清晰明白(可点击最开始卡片链接)
非作者允许情况下,禁止转载或抄袭。
tip:表示方法,可见
定点数中小数点的位置由两个参数确定,一个是定点数的位宽 w,小数位的位宽 wf 。
下面给出一个例子,2Q6(Fix9_6)
2Q6 包含一个 1 个符号位,2 个整数位,6 个小数位。
不论操作数是正还是负,在做补码加减法时,只需将符号位和数值部分一起参与运算,并且将符号位产生的进位丢掉即可。如:
推导过程如下(A与B都是定点数表示的纯整数):
A+B的补码为:1 11 0010,将符号位产生的进位丢掉,因此最终结果为:
注:书写约定整数的符号位与数值位之间用逗号隔开,小数的符号位与数值位之间用小数点隔开。
对于加法,只有在正数加正数和负数加负数两种情况下才可能出现溢出,符号不同的两个数相加是不会溢出的。
对于减法,只有在正数减负数和负数减正数两种情况下才可能出现溢出,符号相同的两个数相减是不会溢出的。
由于减法运算在机器中是用加法器实现的,因此:不论是作加法还是减法,只要实际操作数(减法时即为被减数和“求补”之后的减数)的补码符号位相同,而结果的符号位又与操作数补码符号位不同,即为溢出。(进一步解释:两个符号位相同的补码相加,如果和的符号位与加数的符号相反,则表明运算结果溢出;两个符号位相反的补码相减,如果差的符号位与被减数的符号位相反,则表明运算结果溢出。)如:
在4位机中,A=5,B=-4,则A-B溢出,推导过程如下:
A-B的补码为1001,结果的符号位为1,实际操作数的符号位为0,因此溢出。
一位符号位判断溢出方法不仅需要判断加法运算的结果,而且需要保持原操作数。
此时判断溢出的原则是:当2位符号位不同时,表示溢出;否则无溢出。不论是否发生溢出,高位符号位永远代表真正的符号。
运算结果的符号位为01表明两个正数相加,结果大于机器所能表示的最大正数,称为上溢;运算结果的符号位为10表明两个负数相加,结果小于机器所能表示的最小负数,称为下溢。
也就是说,两个正数相加,数值位不应向符号位同时产生进位,使得结果数的符号位和操作数的一样,为00:
两个负数相加,数值位应向符号位产生进位,使得两个负数的双符号位的运算为11;
当运算结果的两个符号位不相同时,表明出现了溢出。判断溢出的逻辑表达式:
其中Z′为增加的符号位。
采用双符号位补码后,任何小于1的正数,两个符号位都是0;任何大于-1的负数,两个符号位都是1。如果两个数相加后,其结果的符号位出现01或10时,表示发生溢出。因为两个绝对值小于1的数相加,其结果不会大于或等于2,所以最高位总是表示正确的符号。这也可以表示为:当最高数据位有进位而符号位无进位时产生上溢出(01);当最高数据位无进位而符号位有进位时,表示下溢出(10)。
在双符号位补码中,正常的数据中两个符号位总是相同的,所以在存储数据时不必重复存储,只是在将数据送往运算部件进行运算时才把符号位进行复制形成双符号位补码。
利用数据编码的**最高位(符号位)和次高位(数值部分的最高位)**的进位状况来判断运算结果是否发生了溢出。
两个补码数实现加减运算时,若最高数值位向符号位的进位值与符号位产生的进位输出值不相同,则表明加减运算产生了溢出。因为当x和y均为n+1位正整数时,其和有两种情况:当x+y<2n时,不会发生溢出;当x+y≥2n时符号位没有进位,表明发生溢出。当x和y都是n+1位负数时,其和也有两种情况:当x+y≥-2n时,不会发生溢出;当x+y<-2n时,符号位相加后变成0并且有进位,而数值部分的最高位相加时无进位,结果变为正数,表明发生了溢出。减法的情况与此类似,这种判断方法的逻辑表达式如下:
两个正数相加,最高两位的进位为01,表示发生了溢出,其结果为负数,显然是错误的。 两个负数相加,最高两位的进位为10,表示发生了溢出,其结果为正数,显然是错误的。
上述运算过程可归纳为:
①乘法运算可用移位和加法来实现,当两个四位数相乘,总共需做四次加法和四次移位。
②由乘数的末位值确定被乘数是否与原部分积相加,然后右移一位,形成新的部分积;同时,乘数也右移一位,由次低位作新的末位,空出最高位放部分积的最低位。
③每次做加法时,被乘数仅仅与原部分积的高位相加,其低位被移至乘数所空出的高位位置。
计算机很容易实现这种运算规则。用一个寄存器存放被乘数,一个寄存器存放乘积的高位,又用一个寄存器存放乘数及乘积的低位,再配上加法器及其他相应电路,就可组成乘法器。又因加法只在部分积的高位进行,故不但节省了器材,而且还缩短了运算时间。
最低位是1,将被乘数加到部分积中。
将乘数中已经判定过的1,移除,丢弃已经没用。乘数整体右移,这样乘数最左边就多出来一个数位。除此之外,将部分积整体右移,左边拿0补,右边移出的数不能丢保存到乘数寄存器的第一位。
以乘数新的最后一位进行判定,然后与部分积进行相加
再次进行移位操作,将乘数的最后一位右移删除,空出的最高位由部分积的移出的最低位补充
乘数的最后一位是0,不用再加上被乘数,所以结果直接为部分寄存器中的值
注意:这里虽然加上的是0,但是在实际操作中,是没有这一步的,但是控制移位是必修要进行的
将乘数最后一位进行判定,加上被乘数
进行移位运算,最终结果是部分积寄存器中的高位和乘数寄存器中的低位组合,就是最终的结果
A为移位寄存器,用来保存部分积
Q为移位寄存器,用来保存乘数和部分积的低位部分
X为通用寄存器,用来保存被加数
C为计数器,用来控制整个乘法的运行步骤和循环次数
用移位的次数判断乘法是否结束
当商的位数和除数的位数一样时停止
商的符号位单独处理x与y异或运算 数值部分为绝对值相除x^* / y^* 被除数不等于0,除数不能为0
一共进行了5次上商,4次移位,第一次上商判断是否发生溢出:
若在小数定点机中,第一次上商上1,说明发生溢出,商的值大于1,所有只能表示绝对值小于1的数
白中英第五版计算机组成原理课后习题参考答案
诺依曼型计算机的主要设计思想是什么?它包括哪些主要组成部分?
诺依曼型计算机的主要设计思想是存储程序和程序控制,
是指将程序和数据事先存放到存储器中,
而程序控制是指控制器依据存储的程序
来控制全机协调地完成计算任务。
存储程序并按地址顺序执行,
诺依曼型计算机的主要设计思想。
、什么是存储容量?什么是单元地址?什么是数据字?什么是指令字?
、指令和数据均存放在内存中,计算机如何区分它们是指令还是数据?
、写出下列各整数的原码、反码、补码表示(用
位,用补码表示,基数为
题中并未说明具体偏移量,
故此处按照移码的定义,
,则在上述条件下,浮点数为最大数的条件如下: