文章目录
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 41≤∣S∣<1
- S表示尾数
- 原码无论正负,第一位数总为1
- 补码,符号位和第一数位不同
- 尾数的绝对值大于1,尾数溢出要右规
- 两个正数相加就可能会造成01.XXXXX这种形式的溢出
阶符、数符均取2位
- 恒置1法,不管末位丢掉什么数据,计算结果的最低有效位均为1
- 如果采用0舍1入法进行舍入处理,则0.01010110011舍去最后一位后,结果为(0.0101011010)。
- 整个浮点数发生的溢出,阶码比+127还大就发生了上溢;
- 阶码比-128还小就是下溢。下溢作为0看,上溢进入出错处理
- 在浮点数中,当数的绝对值太小,以至于小于能表示的数据时,称为浮点数的下溢
二、浮点乘除运算
设浮点数阶码为双符号位补码表示,尾数用单符号补码或原码表示
- 阶码相加减(乘积阶码为[jx]补+[jy]补;商的阶码为[jx]补-[jy]补)
- 尾数相乘或除;被除尾数的绝对值一定小于除数尾数的绝对值
若被除数尾数绝对值大于除数尾数绝对值,则被除数进行调整——>被除数尾数右移,阶码+1,直到|被除数尾数|<|除数尾数| - 结果向左规格化并舍入处理
- 判断溢出:尾数不可能发生溢出,运算结果可能发生溢出
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的补
补码两位乘
- 比一位乘部分积多取一位符号位(共三位);乘数也多取一位符号位(共两位)
- yn-1ynyn+1分别以一位乘规则判断 yn-1yn和ynyn+1得出结果,两结果合并执行
- 如最后三位为011, yn-1yn=01得出加x补后右移
- ynyn+1=11得出仅右移
- 则最终需要将加x补后右移得到的数再整体右移即为在加2[x]补(
即为被乘数左移一位的结果
)后右移两位
- 末位三位的判断如下:
000:直接右移两位
001:部分积+被乘数的补码后移动两位
010:部分积+被乘数的补码后移动两位
011:部分积+2被乘数的补码(也就是被乘数左移一位的结果)后移动两位
100:部分积-2被乘数的补码(也就是被乘数左移一位的结果)后移动两位
101:部分积-被乘数的补码后移动两位
110:部分积-被乘数的补码后移动两位
111:直接移两位 - 乘数的尾数分奇数偶数两种情况:
- 偶数时采取两位符号位,奇数时采取一位符号位。
- 偶数情况下:移位次数为尾数位数/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;②补码符号位和第一位不同
- ①左规:尾数左移一位,阶码-1,直到数符和第一位不同
- ②右规:尾数溢出(尾数绝对值>1)时右规,即尾数为01.xxx或10.xxx时,尾数右移阶码+1
- 舍入 :对阶右规可能尾数末位丢失
- 恒置一法:计算结果最低有效位为1
- 0舍1入法
浮点数乘除
- 阶码相加减(乘积阶码[jx]补+[jy]补;商为相减)
- 尾数相乘/除
- 被除数若为0,则商0;除数为0,则商无穷大
- 被除数尾数绝对值小于除数尾数绝对值,若被除数尾数绝对值大于除数尾数绝对值则被除数调整——>被除数尾数右移,阶码+1到小于为止
- 左规并舍入处理
- 判断溢出:尾数不溢出,结果可能溢出