基本运算部件

“我不知道你们的名字,”冯·诺伊曼拍拍前两个士兵的肩,“你们两个负责信号输入,就叫‘入1’、‘入2’吧,”他又指指最后一名士兵,“你,负责信号输出,就叫‘出’吧。”他伸手拨动三名士兵,“这样,站成一个三角形,出是顶端,入1和入2是底边。”[...]冯·诺伊曼接过来分给三名士兵,每人一白一黑,说:“白色代表0,黑色代表1。好,现在听我说,出,你转身看着入1和入2,如果他们都举黑旗,你就举黑旗,其他的情况你都举白旗,这种情况有三种:入1白,入2黑;入1黑,入2白;入1、入2都是白。”[...]“这三个人组成了一个计算系统的部件,是门部件的一种,叫‘与门’。”冯·诺伊曼说完停了一会儿,好让皇帝理解。”

摘录来自 《三体》刘慈欣

一位全加器(FA)

image-20230414192724978image-20230414194048799

Ai+Bi如果两个数相同,加一块后一定是0(先不考虑进位),否则一定是1,所以可以直接用异或门进行计算

因为可能有前面的进位Ci-1,所以计算一次后需要与低位的进位再通过一次异或门,这样就能求出Si

只有Ai与Bi同时为1时需要进位,也可能是Ai+Bi第一次通过异或门后得到的数与Ci-1同时为1时需要进位,不管哪个符合都需要进位

所以Ai和Bi通过一次与门,Ai+Bi第一次通过异或门后得到的数和Ci-1通过一次与门,然后这两个结果通过一次或门就可以得到Ci

这样就可以得到一个电路图image-20230414194141048

对蓝色框部分进行封装就可以变为一位全加器(full adder,简称FA)

一位全加器

串行加法器

image-20230414195158818

并行加法器

心平气和,学不会就摆烂,也不是什么重点

根据FA的表达式,如果计算两位数相加

Gi=AiBi,Pi=AiBi

C1=G1+P1C0

C2=G2+P2C1=G2+P2(G1+P1C0)=G2+P2G1+P2P1C0

C3=G3+P3G2+P3P2G1+P3P2P1C0

C4=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0

image-20230414200510691

带标志加法器

 

image-20230415085654152

image-20230415092055817

记忆方法解释是否有意义
Zero零ZF=1表示结果F为0对无符号和有符号数都有意义
Overflow溢出OF=1表示带符号整数运算对无符号数无意义
Signal信号SF表示结果的符号对无符号数无意义
Carry进位CF表示无符号整数运算时的进位,判断是否发生溢出对有符号数无意义

算术逻辑单元(ALU)

image-20230415093029909

定点数的运算

加减法[常考]

补码加减法运算

image-20230414204123674

image-20230414204451201

 

溢出判别方式[🌟🌟🌟]

移位计算

算术移位

 

逻辑移位

当作无符号数的算数移位

循环移位

image-20230415101528718

乘法[易考概念]

乘法运算由累加和右移操作实现

原码一位乘法

例2.7

32位无符号数乘法运算的逻辑结构图

补码一位乘法[Booth算法]

例2.8

补码一位乘法的逻辑结构图

除法

除法运算由累加和(逻辑)左移实现

32位除法运算的逻辑结构图

原码除法运算[不恢复余数法]

例2.9

补码除法运算[加减交替法]

例2.10

C语言中的整数类型及类型转换[🌟🌟🌟]

有符号数和无符号数的转换

不同字长正数之间的转换

 

数据的存储和排列[🌟🌟🌟]

数据的大端方式和小端方式存储

数据按边界对齐方式存储

例1:

asd1

asd2

asd3

asd4

C语言结构体中不同的声明顺序导致结构体占用的空间也不一样

错题集

  1. image-20230419142301450

    答案与解析:
    答案: D
    解析:
    溢出标志即为状态寄存器,A正确
    数据总线供ALU与外界交互数据使用,B正确
    ALU为运算器核心,C正确
    地址寄存器不属于运算器,D错误
  2. image-20230419142312860

    答案与解析:
    答案: C
    解析:
    不带进位位的循环左移将最高位进入最低位和标志寄存器C位
    不带进位位的循环位移=传送带
  3. image-20230419142330494

    答案与解析:
    答案: B
    解析:
    扩展为高位需要补符号位(正数补0,负数补1)
    16位补码第一位是8,换成2进制就是1000,也就是负数,所以扩展后前面为FFFF,排除A和D
    C选项后面的FFA0和题目不一样,所以选B(拓展了不会改变原数值)
  4. image-20230419142346082

    答案与解析:
    答案: B
    解析:
    A:模4运算更容易检查加减运算中的溢出问题
    B、C、D:任何一个正确的数值,模4补码的两个符号位总是相同的,所以只需要存储一个符号位;只有把两个模4补码的数送往ALU完成加减运算时,才把每个数的符号位值同时送到ALU的双符号位中,即只在ALU中采用双符号位。所以选B
  5. image-20230419142402873

    答案与解析:
    答案: D
    解析:
    采用进位位判断溢出时,最高有效位进位和符号位进位的值不同时才会溢出
  6. image-20230419142419365

    答案与解析:
    答案: B
    解析:
    X0,X1不同会发生溢出(X1当作第二个符号位,模4补码)
  7. image-20230419142435815

    答案与解析:
    答案: D
    解析:
    1位乘需要向右移动N次,加上原来的N位,一共2N位数值位
    乘积的结果需要加上1位符号位,所以一共2N+1位
  8. image-20230419142452317

    答案与解析:
    答案: B
    解析:
    B说的对
  9. image-20230419142516834

    答案与解析:
    答案: B
    解析:
    不管补码减法还是无符号数减法,都是用被减数加上减数的负数的补码来实现的。x-y=x+[-y]
    x的输入信息都一样,忽略
    [-y] = 1101 1010
    其中,由于这是减法,所以SUB中为1,所以进位信息为[-y]-1=[-y]=1101 1001,SUB(进位信息)=1
  10. image-20230419142529690

    答案与解析:
    答案: D
    解析:
    C语言的数据在内存中为补码形式
    x的机器数为0...(26个0)01...(6个1)1=0000007F H(正数原反补一样)
    y的机器数为10...(11个0)01001=补=>1...(12个1) 0111=FFF7 H
    z的机器数将前两个加一块=0...076 H(最高位进位1自然丢弃) (可能我电脑默认小端存储,题目默认大端存储)
  11. image-20230419142559510

    答案与解析:
    答案: D
    解析:
    int a占4B,char b占1B,short c占2B
    数据按边界对齐:起始地址能被自身长度整除
    结构体成员边界对齐规则:如果一个结构体内有某些成员,一行的大小是结构体内最大元素的大小,其他元素对齐
  12. image-20230419142611968

    答案与解析:
    答案: A
    解析:
    2x=x算术左移一位=1 1101000
    y/2=y算术右移一位=1 1011000
    相加得到1 1000000,均无溢出
  13. image-20230419142629006

    答案与解析:
    答案: C
    解析:
    8位定点补码表示范围是-128~127
    x+y=78;-x+y=-128;x-y=128;-x-y=-78
    显然只有x-y溢出
  14. image-20230419142640945

    答案与解析:
    答案: D
    解析:
    [si]=1000 0000 0000 0001(最前面的1是符号位)
    1000 0000 0000 0001(把符号位当数值位)=215+1=32768+1=32769
  15. image-20230419142657272

    答案与解析:
    答案: C
    解析:
    x转原码,第一位F换成二进制第一位肯定是1,所以一定是负数,后面的F转原码后一定是0,所以只需要看DF H的二进制转原码
    DF H = 1101 1111B = 0010 0001(原码)=33
    y的第一位是0(正数),原反补一致,所以y=65
    [-y]=[...0100 0001]=FFFF FFBF(前边的部分无所谓,只需关注16进制的后两位)
    x和-y补码的最后一位相加=F+F = 1E,所以选E
  16. image-20230419142730341

    答案与解析:
    答案: A
    解析:
    R1的原码为1000 ... 0001,R2的原码为1000 ... 0001 0000
    R1-R2=1000 ... 0001 + 0000 ... 0001 0000,没有发生进位=>CF=0,没有发生溢出=>OF=0
  17. image-20230419142740889

    答案与解析:
    答案: A
    解析:
    short是16位,所以usi的机器码是1111 1111 1111 1111
    第一位当作符号位后,[si]=1111 1111 1111 1111,所以[si]=1000 ... 0001=-1
  18. image-20230419143005224

    答案与解析:
    答案: D
    解析: