运算方法和运算电路

2022.11.25

基本运算部件

Overview:

注意本节不是重点!

  1. 一位全加器:通过两个加数和上一位进位位,计算出本次的结果和进位位
  2. 串行全加器:一个结果计算出来下一位再计算,速度慢
  3. 并行全加器:利用公式把串行全加器结果算出来,这样一下就计算出来了
  4. 带标志加法器:

一位全加器

和表达式:Si=AiBiCi1

进位表达式:Ci=AiBi+(AiBi)Ci1

img

我的理解:

  1. 和表达式:两个加数和上一位进位位,依次相加,这里的相加用的是异或
  2. 进位表达式:两种情况,AB都是1,或,AB有一个是1一个是0同时上一位有进位

串行进位加法器

img

缺点:时间慢

并行进位加法器

img

(47)Ci=AiBi+(AiBi)Ci1(48)=Gi+PiCi1=1+1

C1=G1+P1C0

C2=G2+P2C1=G2+P2G1+P2P1C0

C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1C0

C4=G4+P4C3=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0

带标志加法器

img

溢出OF(有符号数看OF)CiCi1

符号SF:Fn1

零标志ZF=1:当所有F=0

进位/借位CF(无符号数看CF)CoutCin,(加法CF=0,减法CF=1)

强烈推荐课程:

定点数的移位运算

算术移位

正数全加零,负数原码全加零,负数反码全加一,负数补码左移加0,右移加1

 码制填补代码
正数原码、补码、反码0
负数原码0
负数补码左移添0
负数补码右移添1
负数反码1

逻辑移位

溢出部分丢弃,左右都补零

循环移位

img

 

定点数的加减运算

定点数的乘除运算

注意定点小数的除法也是用定点数来表示的,表示不了大于1的小数,所以定点小数除法中,被除数一定要小于除数!

算法符号位移动累加
原码一位乘法单独运算nn
补码一位乘法(Booth)参与运算nn+1
原码除法(恢复余数)单独运算nn+k
原码除法(加减交替)单独运算n最后余数为正: n+1
最后余数为负: n+2
补码除法(加减交替)参与运算nn+1

原码一位乘法

SUMMARY: 移一次,加一次

  1. 符号单独运算
  2. 举例:[x]=1,1101,[y]=0,1011

img

img

符号位:Ps=xsys=1

结果:[xy]=1,10001111

推荐网课:

补码一位乘法(Booth算法)

SUMMARY:移一次加一次,最后多加一次

  1. 符号参与运算

  2. 运算规则

  3. ynyn1(辅助位)操作
    00部分积右移一位
    01部分积右移一位,加[y]
    10部分积右移一位,加[y]
    11部分积右移一位
    ab部分右移一位,加[(ab)×y]

    例题

    img

  4. 原理

    知乎问题链接

    原理讲解(By SlieKongroo)

    怎么理解Booth算法? - 坤坤的回答 - 知乎

    我的理解:

    如果每次加法都是加1移位,比如101111×x,可以把一些连续的1合并起来进而减少加法次数:101111×x=110000×x1×x

    “丢失位(右)”减去“最后一位(左)”是-1,说明处于连串的1要开始了,先减一个小的。

    “丢失位(右)”减去“最后一位(左)”是0,说明处于连串的1或0之间,不做运算。

    “丢失位(右)”减去“最后一位(左)”是1,说明处于连串的1结束了,加一个大的。

原码除法(恢复余数法)

  1. 符号单独运算

  2. 例题:[x]=0,1101,[y]=0,1011

    img

    符号位:Ps=xsys=0

    结果:[xy]=0,1101

资源推荐:

计组之数据运算:7、定点数原码除法运算(恢复余数法、加减交替法)

原码除法(加减交替法)

  1. 符号单独运算

  2. 加减次数:最后余数为正 n+1次,最后余数为负n+2次

  3. 左移次数:n次,最后一轮不需要移动

  4. 例题:[x]=0,1101,[y]=0,1011

    img

    符号位:Ps=xsys=0

    结果:[xy]=0,1101

    我的理解:

    • 恢复余数如何变成加减交替:之前的不恢复余数法太慢了,如果商1后结果是负数,原来的做法是把除数加回去左移再商1,现在这一步可以被简化成左移再加[+|y|]
    • 最后一轮没办法用上述方法了,所以变成了恢复余数法,如果余数为正,商1,如果余数为负,商0,然后恢复余数。

补码除法(加减交替法)

  1. 补码一位除法的特点是,符号位与数值位一起参加运算,商符自然形成。除法第一步根据被除数和除数的符号决定是做加法还是减法;上商的原则根据余数和除数的符号位共同决定,同号上商“1”,异号上商“0”;最后一步商恒置“1”。

    加减交替法的规则如下:

    ①符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示。

    ②若被除数与除数同号,则被除数减去除数;若被除数与除数异号,则被除数加上除数。

    ③若余数与除数同号,则商上1,余数左移一位减去除数:若余数与除数异号,则商上0,余数左移一位加上除数。

    ④重复执行第③步操作n次。

    ⑤若对商的精度没有特殊要求,则一般采用“末位恒置1”法。

  2. 例题:

    (22)[x]=0,1101,[y]=1,1011[x]=0,1101[y]=1,0101[y]=0,1011

    img

  3. 补码不恢复余数法,够减商0,不够减商1

C语言整数类型与类型转换

有符号数与无符号数

一般机器采用补码进行存储,下面是同样的内容通过short和unsigned short解释的结果:

变量真值1514131211109876543210
short x-43211110111100011111
usigned short y612151110111100011111

案例:

不同字长的整数转换

多出的部分截断,少的位数补“零”

案例:

数据的存储与排列

大端字节序与小端字节序

int i = 01234567H;

img

“边界对齐”

对齐方式:

char按1B,short按2B,int占4B,douoble占8B

例题:

若变量x的数据类型为strcut node,x的首地址是 0x804 9818,x.phone的起始地址?

18 + 9 = 18 + 8 + 1 = 21

21 + 16 = 21 + 15 + 1 = 31

注意int需要从4B整数倍开始存储,31 -> 34

34 + 4 = 38

答案:0x804 9838

假设32位计算机:

边界对齐:

img

边界不对齐:

img

边界对齐方式相对边界不对齐方式是一种空间换时间的思想。精简指令系统计算机通常采用边界对齐方式,因为对齐方式取指令时间相同,因此能适应指令流水线。