第六章计算机的运算方法

6.1无符号数和有符号数

一、无符号数

在这里插入图片描述

二、有符号数

1.机器数与真值

在这里插入图片描述

2.原码表示法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
故利用补码来做减法

3.补码表示法

在这里插入图片描述
在这里插入图片描述
-1011=+0101(mod 24)

  • 1011用8421法看出为11,模为24即为16。16-11=5即8421法得0101。故:-1011=+0101(mod 24)
  • 也可用二进制减法做,24为10000,10000-1011=+0101;详情见计算机基础必备:https://blog.csdn.net/qq_44152807/article/details/105267981
    在这里插入图片描述
    为了多个符号位,之前的计算用的24与现在符号位需要的24;2个24相加为25,故用25作为模
    在这里插入图片描述
    在这里插入图片描述
  • 此时小数是mod 2,若是mod 4则小数的前面是2位.mod 8则小数的前面是3位。mod 16则小数的前面是3位
    在这里插入图片描述
    在这里插入图片描述
    知补码求原码:真值为负时,补码转到原码符号位不变,每位取反,末位加1
    正数的补码就是其原码
    在这里插入图片描述
    在这里插入图片描述
    70=64+4+2即是1000110
    负数的补码更好算的方法:符号位不变,X1的非,X2的非到XK的非,后面的10000等照写,得到的就是这个负数的补码
    -1有补码无原码
4.反码表示法

在这里插入图片描述
除符号位,负数的反码:各位取反,末位不加

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(1)当Y是正数的情况,(2)为当Y是负数的情况

5.移码表示法

在这里插入图片描述
31用32-1表示即25-1即100000-1为11111
在这里插入图片描述
在这里插入图片描述
补码换到移码符号位取反即可
在这里插入图片描述
在这里插入图片描述

6.2 数的定点表示和浮点表示

定点表示

在这里插入图片描述

浮点表示

在这里插入图片描述
在这里插入图片描述
尾数的绝对值<=1,阶码是整数
r=2:尾数当中每一位二进制数表示了尾数中的一位2进制数。
r=4:尾数当中的两位二进制数表示一位4进制的尾数
r=8:尾数中的三位二进制数表示一位8进制的尾数
r=16:4位二进制数表示一位16进制数

 当r=2 N=11.0101——>=0.110101×210因为右移两位数据,数据本身大小变为原来的1/4,则阶码部分变为10,10是二进制表示即十进制中的2即22即就是4
 N=0.00110101×2100小数点往左移了四位,变为原来的1/16,阶码中而二进制中的100就是4.即24=16
二进制:-11,-10,-1,0,1,10,11

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因2m-1=15,则m=4。当m=4时,因为机器数字长为24位,则n=24-m-1=18
在这里插入图片描述
r=2——>左规:数据向左移动;右规:数据向右移动,数据值变为原来的1/2
在这里插入图片描述
在这里插入图片描述
19=16+2+1即10011
19/128即将10011除128,128=27即10011数据相对于小数点右移7位;每移一位相当于除以2。变为0.0010011
浮点机当中用分号将阶码和尾数隔开
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.3 定点运算

一、移位运算

在这里插入图片描述
对于计算机来说,都是数据移动而小数点的位置不变
左移一位,机器数的真值变为原来的2倍;右移变为原来的1/2倍,有时可能因为低位丢掉影响了精度
在这里插入图片描述
左移最高位会被丢掉,最低位补;
右移最低位丢掉,符号位的下一位高位补
即空出的地方补

在这里插入图片描述
左移一位,真值变为原来的2倍
对于正数,三种机器数移位后符号位均不变,左移时最高位丢1,结果出错;右移时最低位丢1,影响精度。
在这里插入图片描述
负数原码左移时,高位丢1,结果出错,右移时,低位丢1,影响精度
在这里插入图片描述
负数的补码左移时,高位丢0(原码的1),结果出错;右移时,低位丢1,影响精度

在这里插入图片描述
第一行第四个:左移——>负数的反码最低位添1,最高位丢掉,符号位不变
第二行第四个:右移——>负数的反码最高位添1,最低位丢掉
在这里插入图片描述
算数移位符号位不参与移位运算,逻辑移位全部参与移位运算
可以用带进位的移位将丢掉的最高位记录在进位中

二、加减法运算

在这里插入图片描述
在这里插入图片描述

  • 对整数来说mod 2n+1不管是正数还是负数它(A)的补码形式都可以用X+2n+1表示(不用区分加数或被加数的正负,直接A的补码表示为2n+1+A)
  • 对小数来说,A的补码可以直接变为2+A
  • 对于补码,连同符号位一起运算,和的符号通过计算过程自动产生,符号位产生的进位自动丢掉

在这里插入图片描述
由[A+B]求A+B——>直接将[A+B]取反末位加1
在这里插入图片描述
== -B的补码=将B的补码数值位每位取反,末位加1==
练习一:在小数定点机中计算结果为大于1的数发生溢出
练习二:整数定点机中机器字长为8位计算结果-138超出了这种机器所能表示的范围(-128~127),发生上溢

溢出判断

在这里插入图片描述
数值最高位进位和符号位进位不同(异或结果为1)则溢出

在这里插入图片描述
当两位符号位不同,表示溢出。不论是否发生溢出,高位符号位表示真正的符号。
双符号位的模可以变为2n+2
在这里插入图片描述
GA,GS标记做加法、减法。

在整数定点机中,机器数采用补码,双符号位,若它的十六进制表示为C0H,则它的真值为(-64)。

三、乘法运算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最终结果就是0.1000 1111
在这里插入图片描述

原码一位乘法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
部分积右移最低位被移到乘数的最高位当中得新的部分积,乘数也右移,最低位丢掉
在这里插入图片描述

在这里插入图片描述
移位次数控制乘法操作的结束
乘数最后一位为1,部分积+X(被乘数绝对值),右移一位
乘数最后一位为0,部分积+0,右移一位
最后符号位异或

补码一位乘法

在这里插入图片描述
在这里插入图片描述
2-n=2-n+1-2-n
第一位可以看出最后一位没有移位
在这里插入图片描述

在这里插入图片描述

  • 第三列为附加位,开始的时候此位=0.
  • 比较第三列和第二列最后一位(0-1=-1),则需要加上[-x]再右移(因为是补码则算数右移),此时补码是负数右移补1。等等依次类推步骤
  • 第二行第一列,蓝色的1是由于此时补码是负数右移补1
  • 第三行第一列,蓝色的0是由于此时补码是正数右移补0
  • 到第五行,0-1=-1则加上[-x]得到结果,此时不用再移位——>最后一步不移位

[X.Y]中Y为负数,加上[-x];Y是正数则不用

在这里插入图片描述
在这里插入图片描述


 符号位参与运算,得到的也是补码形式
 被乘数x取双符号参与运算,部分积初值为0。
 乘数y取单符号位,乘数y末位增加一个附加位0.
判断y的最后两位:

  • 倒数第一位-倒数第二位=0——>直接右移一位
  • 倒数第一位-倒数第二位>0——>加x后右移
  • 倒数第一位-倒数第二位<0——>加-x后右移
  • 最后一位不右移
  • 得到的是X*Y的补

四、 除法运算

在这里插入图片描述

  • 被除数0.1011小于除数0.1101,上商为0,然后被除数后添0和右移一位的除数作比较。此时被除数大于右移一位的除数则上1。相减,得数添0与右移两位的除数比较。
    在这里插入图片描述

原码除法

在这里插入图片描述
若不满足约定,即,小数定点运算中被除数的绝对值>除数的绝对值,(即第一步发现上商为1)——>发生溢出
整数定点除法中被除数的绝对值>除数的绝对值,则发生了溢出

在这里插入图片描述

  • 第一行上商后+[-y*],得到第二行第一列的余数为负数,商上为0不能上1则说明减法操作不对,要把被减掉除数之后的余数要进行恢复——>加上y的补码恢复余数
  • 此时得到的余数值与原来的被除数相同,将此时余数的值左移(逻辑左移)一位
  • 移位后的再做减法操作和[-y*]进行比较
    依次循环在这里插入图片描述
    符号位异或,被除数绝对值+[-y*]
    余数正,上商1,左移一位(被除数和商都左移),+[-y*];据它的值再进行上商.
    余数为负,上商0,加除数[y*]恢复余数,余数左移一位,再减去除数即+[-y*]得到新的余数。再判断新的上商是上0还是1;若这个新的余数>0,则上商1;余数<0,则上商0。

在这里插入图片描述
被除数绝对值+[-y*]
余数>0,上商为1,余数左移一位并加上[-y*](除数)
余数<0,上商为0,余数左移一位并加上[y*](除数)
最后符号位异或

在这里插入图片描述
在这里插入图片描述
第一次上商是1则溢出

在这里插入图片描述

补码除法

初始商0,第一步据同异号判断是否+y]或[-y],不上商
余数[Ri]与[y]同号——>上商为1,新余数左移一位+[-y]
余数[Ri]与[y]异号——>上商为0,新余数左移一位+[y]
最后一步,左移一位,末位商恒置1

6.4 浮点四则运算

浮点运算的特点:阶码(指数)运算和尾数(基值)运算分开进行

一、浮点加减运算

在这里插入图片描述

  • 阶码对齐则可以进行加减运算
  • 求阶差用补码形式实现
  • 阶码减小一位,尾数就要左移一位保证数据不发生变化
  • 而计算机中x向y看齐,尾数左移有可能使1被移掉,引发错误,故尾数左移并不合适
  • 若y向x看齐,最右侧数据位丢失,只会影响精度而不影响大小
  • 小阶向大阶看齐
    在这里插入图片描述
  • 这道题中阶码四位,阶符占了两位;尾数六位,尾符占了两位。
  • 阶码在前;尾数在后(2位阶符,2位阶码;2位尾符.4位尾数)
  • jx补-jy补=jx补+[-jy补]
  • [-jy补]=原码取反加1
  • 对阶后就可以尾数求和,但此时得到的是不规格化的数
    在这里插入图片描述
  • 规格化是为了尽可能的提高在计算机中浮点数的表示精度
  • 若尾数的基值r=4,则 1 4 ≤ ∣ S ∣ < 1 \frac{1}{4} \leq|S|<1 41S<1
  • S表示尾数
  • 原码无论正负,第一位数总为1
  • 补码,符号位和第一数位不同
    在这里插入图片描述
    在这里插入图片描述
  • 尾数的绝对值大于1,尾数溢出要右规
  • 两个正数相加就可能会造成01.XXXXX这种形式的溢出

在这里插入图片描述
阶符、数符均取2位
在这里插入图片描述

  • 恒置1法,不管末位丢掉什么数据,计算结果的最低有效位均为1
  • 如果采用0舍1入法进行舍入处理,则0.01010110011舍去最后一位后,结果为(0.0101011010)。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 整个浮点数发生的溢出,阶码比+127还大就发生了上溢;
  • 阶码比-128还小就是下溢。下溢作为0看,上溢进入出错处理
  • 在浮点数中,当数的绝对值太小,以至于小于能表示的数据时,称为浮点数的下溢

二、浮点乘除运算

在这里插入图片描述
设浮点数阶码为双符号位补码表示,尾数用单符号补码或原码表示

  1. 阶码相加减(乘积阶码为[jx]+[jy];商的阶码为[jx]-[jy])
  2. 尾数相乘或除;被除尾数的绝对值一定小于除数尾数的绝对值
    被除数尾数绝对值大于除数尾数绝对值,则被除数进行调整——>被除数尾数右移,阶码+1,直到|被除数尾数|<|除数尾数|
  3. 结果向左规格化并舍入处理
  4. 判断溢出:尾数不可能发生溢出,运算结果可能发生溢出

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.5 算数逻辑单元

一、ALU电路

运算器
在这里插入图片描述

  • Ai、Bi表示参加运算的数据,Fi为输出。
  • Ki决定是什么类型的运算
  • 输入、输出端都要连接寄存器,保存运算结果
  • 影响加法器运算速度的就是进位链

二、快速进位链

在这里插入图片描述

  • A、B输入,C-1低位进位。C1向高位的进位,S某一位的输出和。
  • 若进位快,则运算结果快
  • 若ti=1,那么Ci=Ci-1
    在这里插入图片描述
    d1=A1×B1;
    t1=A1或上B1
    串行运算器结构简单,其运算规律是(由低位到高位逐位运算)。
    在这里插入图片描述
    电路太过复杂
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 双重分组跳跃进位链是将n位全加器分为几个大组,大组内又包含若干小组,每个大组内所包含的各小组的最高位进位是同时产生的,大组和大组采用串行进位。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

小结

右移为整体右移

补码

  • 负数补码为原码除符号位每位取反末位+1
  • 知负数的补码求原码:除符号位每位取反,末位+1
  • 正数的补码与原码相同
  • 负数的补码更好算的方法:符号位不变,X1的非,X2的非到XK的非,后面的10000等照写,得到的就是这个负数的补码
  • 知[y]求[-y]:[y]连同符号位每位取反,末位+1
  • -1有补码无原码
  • [-0]=-128

反码

  • 负数的反码:除符号位,各位取反,末位不加
  • [-0]=-127

移码

  • 比较大小通过移码
  • 补码符号位取反即为移码

浮点表示

  • N=S×rj;r为尾数基值,S为尾数,j为阶码
  • 尾数的绝对值<=1,阶码是整数
  • 浮点数尾数为0或阶码小于或等于它所表示的最小数(2-m其中m为阶码的位数),按机器零处理

移位

  • 左移一位,真值变为原来的2倍
  • 对于正数,三种机器数移位后符号位均不变,左移时最高位丢1,结果出错;右移时最低位丢1,影响精度。
  • 负数原码左移时,高位丢1,结果出错,右移时,低位丢1,影响精度
  • 负数的补码左移时,高位丢0(原码的1),结果出错;右移时,低位丢1,影响精度
  • 算数移位符号位不参与移位运算,逻辑移位全部参与移位运算

加减法

  • 加减法用补码进行运算
  • 对于补码,连同符号位一起运算,和的符号通过计算过程自动产生,符号位产生的进位自动丢掉

溢出

  • 数值最高位进位和符号位进位不同(异或结果为1)则溢出
  • 当两位符号位不同,表示溢出。不论是否发生溢出,高位符号位表示真正的符号。

原码一位乘

  • 乘数最后一位为1,初态为0,部分积+X(被乘数绝对值),右移一位
  • 乘数最后一位为0,部分积+0,右移一位
  • 最后符号位异或
  • 移位次数可判断乘法是否结束,数值位x位则要移动x次

原码两位乘

原码两位乘法和原码一位乘法一样,符号位不参加运算
部分积和被乘数x均采用三位符号,乘数y末位每次要加一个c,c一开始是0
根据如下法则进行运算:
· 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

而乘数y用双符号还是单符号表示得根据乘数y的数值的奇偶性判断,而且最后一步移位与否也与乘数y的数值的奇偶性有关:
· 如果乘数y的尾数n的位数为偶数,则乘数y用双符号表示,最后一步不移位
· 如果乘数y的尾数n的位数为奇数,则乘数y用单符号表示,最后一步要移一位
根据以上步骤我们就可以求得x * y的源码。
详见计算机组成运算:https://blog.csdn.net/qq_44152807/article/details/103970012

补码一位乘

  • 右移是被乘数与部分积整体右移
  • 符号位参与运算,得到的也是补码形式
  • 被乘数x取双符号参与运算,部分积初值为0。
  • 乘数y取单符号位,乘数y末位增加一个附加位0.
  • 判断y的最后两位:
    • 倒数第一位-倒数第二位=0(00/11)——>直接右移一位
    • 倒数第一位-倒数第二位>0(01)——>加x后右移
    • 倒数第一位-倒数第二位<0(10)——>加-x后右移
  • 最后一位不移
  • 得到X*Y的补

补码两位乘

  1. 比一位乘部分积多取一位符号位(共三位);乘数也多取一位符号位(共两位)
  2. yn-1ynyn+1分别以一位乘规则判断 yn-1yn和ynyn+1得出结果,两结果合并执行
    • 如最后三位为011, yn-1yn=01得出加x后右移
    • ynyn+1=11得出仅右移
    • 则最终需要将加x后右移得到的数再整体右移即为在加2[x](即为被乘数左移一位的结果)后右移两位
  3. 末位三位的判断如下:
    000:直接右移两位
    001:部分积+被乘数的补码后移动两位
    010:部分积+被乘数的补码后移动两位
    011:部分积+2被乘数的补码(也就是被乘数左移一位的结果)后移动两位
    100:部分积-2被乘数的补码(也就是被乘数左移一位的结果)后移动两位
    101:部分积-被乘数的补码后移动两位
    110:部分积-被乘数的补码后移动两位
    111:直接移两位
  4. 乘数的尾数分奇数偶数两种情况:
    • 偶数时采取两位符号位,奇数时采取一位符号位。
    • 偶数情况下:移位次数为尾数位数/2,最后一步仍然要对末三位判断,但是不移位;
    • 奇数情况下移位次数为尾数位数/2+1次,最后一步也要对末三位判断,然后移动一位(注意)。

除法

1.恢复余数法
  • 符号位异或
  • 被除数绝对值+[-y*](y*指y的绝对值)
    • 余数正,上商1,左移一位(被除数和商整体都左移),减除数即+[-y*];据它的值再进行上商.
    • 余数为负,上商0,加除数+[y*]恢复余数,余数左移一位,再+[-y*]得到新的余数。再判断新的上商是上0还是1;若这个新的余数>0,则上商1;余数<0,则上商0。
2.不恢复余数法
  • 被除数绝对值+[-y*]
  • 余数>0,上商为1,余数左移一位并加上[-y*]除数
  • 余数<0,上商为0,余数左移一位并加上[y*]除数
  • 最后符号位异或
补码除法
  • 初始商为0,第一步仅据同异号判断加上[-y]或[y]不上商
  • 余数[Ri]与[y]同号——>上商为1,新余数左移一位+[-y]
  • 余数[Ri]与[y]异号——>上商为0,新余数左移一位+[y]
  • 最后一步,左移一位,末位商恒置1

浮点加减运算

  1. 对阶
    • 求阶差:用补码形式求阶差
    • 对阶:小阶向大阶看齐,阶码减小一位,尾数则左移
  2. 尾数求和(得到其补码形式的和)
  3. 规格化
    • 规格化判断:①原码第一位数为1;②补码符号位和第一位不同
    • ①左规:尾数左移一位,阶码-1,直到数符和第一位不同
    • ②右规:尾数溢出(尾数绝对值>1)时右规,即尾数为01.xxx或10.xxx时,尾数右移阶码+1
  4. 舍入 :对阶右规可能尾数末位丢失
    • 恒置一法:计算结果最低有效位为1
    • 0舍1入法

浮点数乘除

  1. 阶码相加减(乘积阶码[jx]+[jy];商为相减)
  2. 尾数相乘/除
    • 被除数若为0,则商0;除数为0,则商无穷大
    • 被除数尾数绝对值小于除数尾数绝对值,若被除数尾数绝对值大于除数尾数绝对值则被除数调整——>被除数尾数右移,阶码+1到小于为止
  3. 左规并舍入处理
  4. 判断溢出:尾数不溢出,结果可能溢出
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值