计算机组成原理【二】:计算机的计算方法

总导图


关于补码


1、已知[y补]求[-y补],无论正负,都可以通过包括符号位在内都取反然后末位加一得到

相同数量补码可以表示的范围比相同数量原码和反码多一个,没有±0

所以补码表示的定点小数范围是-1~1-2-n,而反码和原码为-(1-2-n)~1-2-n

因为没有±0,所以负数能表示的数比正数多一个。

最高位为符号位分界点,0,XXXXXX表示0~2n-1;

1,XXXXXXX表示-1~-2n

XXXXXXX均为从全0到全1.

浮点数的表示范围


1、前提补充:

  • n位二进制数字表示正整数表示的最大值为2n-1
    • 理解1:有一个数字为0,为0~2n-1
    • 理解2:根据等比求和公式
  • 当n位二进制数字来表示纯小数的时候,表示的最大值为1-2-n,最小值为2-n
    • 理解1:最大值根据等比求和公式
    • 理解1:最小值为最后一位取1其他位取0,代表的就是2-n
  • 阶码、尾码,都分为控制符号部分和数值部分

2、设浮点数阶码的数值部分取m位,尾数的数值部分取n位,当浮点数为非规格化数

表示范围:

  • 最大正数为2(2m-1)×(1-2-n

    • 理解:最大整数=小数最大+小数点向右位移最多—->对应为尾数的n位数值部分表示的最大小数的,其小数点再向右移动,移动的位数为m位阶码数值部分表示的最大数
  • 最小正数2-(2m-1)×(2-n

    • 理解:类似最大整数进行理解即可
  • 最大负数-2-(2m-1)×(2-n

    • 理解:就是最小正数的相反数,数符取1
  • 最小负数-2(2m-1)×(1-2-n

    • 理解:就是最大整数的相反数,数符取1

3、精度由尾数来控制,阶码的数值部分大小用来控制小数点位置

IEEE 754标准


IEEE754数据格式介绍

原码两位乘和补码两位乘法


原码两位乘法

原理:一次判断两位乘数决定部分积的形成

通过笔算分析我们得到:

乘数新部分积
00原部分积右移两位
01原部分积加被乘数后右移两位
10原部分积加2倍的被乘数后右移两位
11原部分积加3倍的被乘数后右移两位

两倍被乘数可以由被乘数左移两位得到,三倍被乘数我们化为减去被乘数再加四倍被乘数,而加被乘数我们可以纳入下一次计算的加一个被乘数,分析如图:

最终我们得到原码两位乘法的计算表

· 000 -》 部分积加0, 右移两位,c变为0

· 001 -》 部分积加|x|, 右移两位,c变为0

· 010 -》 部分积加|x|, 右移两位,c变为0

· 011 -》 部分积加2|x|,右移两位,c变为0

· 100 -》 部分积加2|x|,右移两位,c变为0

· 101 -》 部分积减|x|, 右移两位,c变为1

· 110 -》 部分积减|x|, 右移两位,c变为1

· 111 -》 部分积加0, 右移两位,c变为1

计算完毕后不要忘记单独计算符号位加入

恢复余数法和不恢复余数法


原码恢复余数法和不恢复余数法

之后多看例题。

其实说是在原码除法中,实际上我感觉就是在用补码,只不过由于符号位分开计算,数值位取绝对值原码补码相同

1、符号位单独异或处理得到结果的符号

2、将被除数和除数都取绝对值计算除法,下面的所有除数,被除数都是指的绝对值,因为取绝对值后都为正数,所以此时的原码也就是补码

3、判断商的值,在机器中我们用减法处理,因为为2进制,只有能商和不能商两种情况,也就是被除数(余数)大于除数商1小于除数商0。所以我们通过计算被除数(余数)-除数大于零还是小于零来计算商值,因为此时被除数和除数是原码也是补码,所以我们可以求负的除数的补码然后将减法运算转化为相应加法运算也是可以的。~</font

4、在我们笔算的过程中,余数后补零,除数右移的操作,转化为机器中余数左移,除数不变的操作。之所以可行,是因为我们只是想判断接下来的商,只需要判断数值大小即可,所以笔算中我们将除数(余数)缩小2-1然后比较大小,机器中我们进行左移,也就是将被除数扩大21然后判断值的大小取商也是可行的,

疑问:为什么逻辑左移后偶尔会出现溢出现象,仍然是正确的呢。目前我认为的是,虽然是溢出,但是再次减去除数(加上[-y*]补)仍会回到正确值

其实这样理解是正确的,因为所说是溢出,其实是人为规定的,n位下的溢出,在n+1位下就是正常数值,这样就能解释为啥溢出再除2返回仍然正确,另外,在计算机中可没有小数点和逗号,就是一串数字,这串数字我们人为设置了这么多,所以在计算机中这个长度下有溢出,是固定设计好的。假设我们笔算,n位下溢出了,我们添加一位化为n+1位就没有溢出了,同样可以解释补码的两位乘中我们设置三位符号位的情况下,有类似2倍x的绝对值是001.10101的情况和负数为111.10101的情况,前者是在我们人为规定的长度下溢出,但是实际上它在n+2位下不溢出可以代表2被x的绝对值大小,而符号位全为1是因为我们人为规定就是需要6位,前面多的三位全部用来判断符号了

  • 恢复余数法运算规则
    • 余数 Ri>0 上商 “1”,2Ri – y*
    • 余数 Ri<0 上商 “0”, Ri + y* 恢复余数
  • 不恢复余数法运算规则
    • 余数 Ri>0 上商“1” 2Ri – y*
    • 余数 Ri<0 上商“0” 2Ri + y*
  • 特点
    • 第一次上商判溢出
    • 上商 n+1 次,移 n 次(最后一次上商后不再移),用移位的次数判断除法是否结束

补码不恢复余数法


求商的符号位:

​ 如果被除数与除数同号,用被除数减去除数,

​ 如果被除数与除数异号,用被除数加上除数。

​ 然后判断余数:如果所得余数与除数同号上商“1”,

如果所得余数与除数异号上商“0”。

求商的数值部分:

​ 如果上次上商“1”,将余数左移一位后减去除数,

​ 如果上次上商“0”,将余数左移一位后加上除数,

​ 然后判断余数:如果所得余数与除数同号上商“1”,

如果所得余数与除数异号上商“0”。

​ ……如此重复n-1次

若对商的精度没有特殊要求,商的最后一位采用恒置“1”的方法,并省略最低n+1的操作。此 时最大误差为±2n

1、开始记下除数的符号位,明确全过程比较法则:同减上1异加上0 2、首先被除数和除数比较,决定开始除数加减,不决定上商3、之后都是余数和除数符号的比较,决定上商的数值4、每次上商后都要移位,之后根据商值判断下一步加减除数比较方便。1减0加5、最后一位移位后直接上1

补码除和原码的加减交替法除比较


加法次数多1,是因为原码最后一位商值仍旧需要加减后根据余数判断,而补码直接固定设为1左移即可

浮点加减


关于为什么S>0时,[S]补=00.1XXXX……X、S<0时,[S]补=11.0XXXX……X

1、S为真值,所以规格化数的1/2≤|S|<1

2、真值S>0的时候,不变,仍旧为真值的规格化形式00.1XXXX……X

3、真值S<0的时候,符号位取1,规格化后数值部分取反加1后就有了[S]补=11.0XXXX……X

4、特殊情况:S=-1/2的时候,[S]补=11.10000…0.规定其不是规格化数字

S=-1,[S]补=11.0000.0,小数补码允许表示-1,故看作规格化数

S=-1的原码用一位符号位表示为1.000….0

关于溢出判断的范围。

由于规格化的问题。尾数能够表示的最小正数,最大负数并不是实际补码的能表示的最小整数和最大负数。

例如:阶码为7位阶符2位,尾数为n位数符2位的情况下:

  • 首先明确阶码大小范围为-128~+127

  • 最小负数:-1×2127因为补码可以表示真值-1为最小规格化负数,为11.000…0,尾数取最大)

  • 最大正数:(1-2n)×2127因为补码可以表示真值(1-2^n)为最小规格化正小数尾数,为00.1111..1尾数取最大)

  • 最大负数:(-2-1-2-n)×2-128(因为规格化问题,-1/2规定不为最小规格化小数,只能表示真值为2-1+2-n的最小规格化正数,所以真值为11.1000….01,规格化补码为11.0111…..1)

  • 最小正数:2-1×2-128(因为补码可以表示最小为+1/2的规格化数字,规格化补码为00.10000000)

简易判断方法:

1、首先我们知道固定S>0时候规格码00.1XXXX……X

S<0时候规格码11.0XXXX……X

2、再根据补码的分布规律:

​ 符号位为0(正数):数值位由0000….0到1111……1表示的真值逐渐增大。例如:0~+127

​ 符号位为1(负数):数值位由0000….0到1111……1表示的真值逐渐增大。例如:-128~-1

​ 我们可以很容易得到规格化下:00.1XXXX……X和11.0XXXX……X的表示的真值的大小和X的关系

正数:00.11111….1最大00.10000…最小

负数:11.0111…..1最大11.000……最小

3、根据补码可以很容易获得真值大小

快速进位链


MOOC讲解

算术逻辑单元博客笔记

最初始的加法器:

然后我们要知道加法器的和以及进位,可以根据和在两位加数和进位三个数中,三个全为1或者只有一个为1的情况下才为1,进位输出在其中三个或者两个为1的情况下进位才为1,由此可得到公式:

进位经过化简后可以得到:

这个公式将会是之后所有改进的基础

串行加法器

串行进位链是指并行加法器中的进位信号采用串行传递。

将AiBi和Ai+bi分别记作di,ti。已知两个加数我们就能得到di、ti。

这样每一个进位都可以表示为:

这样我们可以得到串行进位链

并行进位链

并行进位链是指并行加法器中的进位信号是同时产生的,又称为先行进位、跳跃进位等。通常并行进位链有单重分组双重分组两种实现方案。

单重分组跳跃进位

我们将C0带入C1,再将得到的C1带入C2,以此类推得到:

这样我们的进位可以通过最初的进位和各位的加数进行与或操作获得,不必等待前一个进位再计算,这样我们可以得到单重分组跳跃进位链

双重分组跳跃进位链

双重分组跳跃进位就是将n位全加器分成若干大组,每个大组中又包含若干小组,而每个大组内所包含的各个小组的最高位进位是同时产生的,大组与大组间采用串行进位。

1、d和t由小组内的每位加数可直接获得,D和T可根据每个小组内的d和t直接获得,所以给出每位加数,可以直接获得各个小组的D和T

2、根据公式推导:小组内根据d和t和初始进位,可以求出每一位的进位,大组内,根据D和T根据初始进位,可以直接算出每个小组的最高位进位

3、根据此规律。我们将计算过程化为:①同时计算大组全部D、T,初始进位小组内的低位进位②根据D、T和初始进位,同时计算出大组内的所有小组的最高进位③根据计算出的全部大组内小组的最高进位,作为下一位的进位输入,根据d和t,同时计算出全部小组的低位进位。同时下一个大组的初始进位也就获得了④根据d、t初始进位,D、T初始进位计算出下一个大组的第一个小组的全部低位进位和全部大组的高位进位⑤根据d、t和各个小组的初始进位,计算出所有小组的低位进位。⑥若还有大组,则以此类推

4、补充:为了该算法实现,我们可以从上面看出D、T真的就是为了获得小组最高位的进位而生,你可以选择规定其他的D、T计算别的进位,但是对此算法无益。

5、本质思路:初始进位->获得全部小组的最高位进位->作为下一个小组的初始进位->每个小组都能获得初始进位就能计算出小组内的任何进位

-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~