运算方法和运算电路
注意:在本章节中,无需深究并行进位加法器的原理,个人理解只需要明白与,或,非,异或等逻辑运算即可
ALU算数逻辑单元
ALU是一种组合逻辑电路,是运算器的核心部件。根据之前的学习我们得知,补码的减法运算可以变为加法运算,并且乘除法也是这样,所以在ALU中,带标志加法器是它的核心。
定点数的移位运算
对于任何二进制整数,若不产生溢出,则左移一位代表×2。若不考虑右移带来的尾数消失,那么右移一位代表➗2,在学习完两种移位运算后,我们可以结合实例来理解:
1.逻辑移位
逻辑移位按照字面意思来看,符合逻辑即可。所以他是将操作数视为无符号数的移位操作
左移高位移出,低位补0
右移低位移出,高位补0
如果左移移出的是1,那么就代表着发生了溢出。
2.算数移位
算术移位按照字面意思来看,他是和算数息息相关的,所以他是将操作数视为有符号整数的移位操作
我们已知在计算机中的有符号整数都是以补码的形式来保存的。所以我们要采取补码的算术移位方式。
左移高位移出,低位补0
右移低位移出,高位补符号位
如果右移移出的是1,那么精度就会收到影响。如果左移后最高位与最初的最高位不相同,则说明左移后数字的正负发生变化,就代表发生了溢出。
补充:正数和负数的移位操作。他们的符号位均不参与移位。
正数 | 补码 | 补0 |
反码 | 补0 | |
原码 | 补0 | |
负数 | 原码 | 补0 |
补码 | 左移补0,右移补1 | |
反码 | 补1 |
可能有同学会产生疑问,不是说符号位不进行移位吗,为什么上边的算术移位中符号位参加了。我们观察可以得知。正数的补码移位时补0,而正数的符号位就是0,复数的补码移位时补1,而复数的符号位就是1,所以我们形容时直接说成右移低位移出,高位补符号位。也是为了方便记忆。
了解了前边的知识,我们用实例来理解左移和右移的乘除性质:
二进制数:0000 0001 左移1位变为 0000 0010 从2变成4
二进制数:0000 0010 右移1位变为 0000 0001 从4变成2
二进制数:1100 0001 左移1位变为 1000 0010 从-63变成-126
二进制数:1000 0010 右移1位变为 1100 0001 从-126变成-63
定点数的加减运算
1.补码的加减法运算
相关知识点之间复习过,补码的减法可以变为加法运算来操作,即[A-B]补=[A]补+[-B]补。加法运算不变:[A+B]补=[A]补+[B]补
- 符号位与数值位一起参与运算,这往往决定了最后的符号位是什么以及这次运算是否发生了溢出操作
- 最终运算结果的高位丢弃,保留n+1位,并且运算结果依旧是补码
2.溢出的判别方法
只有两个符号位相同的数相加或两个符号位不同的数相减才会发生溢出操作。如两个正数相加,符号位变为1称之为上溢。两个负数相加,符号位变为0称之为下溢。一个负数减去一个正数符号位变为0也是溢出
1.采用单符号位
- 运算的两个符号位相同,但运算结果的符号位与这两个符号位不相同则溢出
- 采用单符号位时我们需要将减法操作首先变为加法操作,这个时候就会统一两个运算数的符号位。
2.采用双符号位
- 按照字面意思理解,双符号位就是用两个符号位来代表符号,运算结束后如果两个符号位相同,则未溢出,不同则代表溢出。
- 双符号位发生溢出时的第一个符号位是本来应该是的符号位
- 01为上溢,10为下溢
3.采用一位符号位根据数值位的进位情况判断。⭐
- 若符号位的进位与数值最高位的进位相同,则无溢出,不同则溢出
可以理解记忆。两个负数相加,如果数值最高位进位,那么进位就会影响符号位。如果此时符号位也进位,则符号位依旧是1,此时没有溢出。两个正数相加,如果数值位最高位进位,那么进位就会影响符号位。如果此时符号位也进位,则符号位变为1,此时发生溢出
也就是说,负数相加,只有符号位和数值位都进位或都不进位是才不会发生溢出。而正数相加不会出现都进位的情况,都不进位是才不会发生溢出。总结之后就是:
- 若符号位的进位与数值最高位的进位相同,则无溢出,不同则溢出
3.加减运算电路
我们要明白,运算器本身是无法识别所处理的二进制串是有符号数还是无符号数的。他在运算之后会产生标志信息,运算器往往通过这些标志信息来判断有符号数和无符号数所产生的不同的答案。
ZF(zero)零标志 | 标志位为1代表数值为0 |
OF(over)溢出标志 有符号数 与最后一种溢出判别方式相同 | 标志位为1代表溢出 |
SF(sign)符号位 | 标志位为1代表负数 |
CF(carry)进/借位 无符号数 | 标志位为1代表溢出 |
利用他们的英文全称往往可以更好的记住这些标志位所代表的含义。
不管是有符号数运算还是无符号数运算这四个标志位都会被计算出来,只不过无符号数看和无符号数相关的,有符号数看和有符号数相关的。
举例理解无符号数和有符号数的大小比较
无符号数大小比较
若A=B, A-B=011-011=000,ZF=1,CF=0
若A>B, A-B=010-001=001, ZF=0, CF=0
若A<B, A-B=000-001=111, ZF=0, CF=1(溢出),即0-1不够减,要借位。
有符号数大小比较
若A=B, A-B=011-011=011+101=(1)000,ZF=1,SF=0, OF=符号位进位和次高位进位异或为0
若A>B, A-B=010-001=010+111=(1)001, ZF=0, SF=1,OF=符号位进位和次高位进位异或为0
若A>B, A-B=011-101=011+011=110, ZF=0, SF=1,OF=符号位进位和次高位进位异或为1(溢出)
若A<B, A-B=000-001=000+111=111, ZF=0, SF=1,OF=0
4.原码的加减法运算(了解即可)
加法操作,符号位相同,则数值位相加,符号位与原来保持一致,如果最高位发生进位,则说明溢出。
加法操作,符号位不同,则数值位绝对值大的减去绝对值小的,符号位与绝对值大的一致。
减法操作,先将减数的符号位取反,再用原码加法进行运算
由于原码的加减法比较复杂,故计算机中往往只采用补码的加减法运算。
定点数的乘除运算
注意!!定点数的乘除运算比较复杂,并且在历年考研试题中考察频率低,建议理解即可,可以之后用真题来辅助记忆相关知识点。故现阶段不做叙述,个人理解当选择题中出现数字相乘判断是否发生溢出,可以将其转换为十进制数计算,判断计算结果是否超出该字长所能代表的最大或最小数字,从而逆推相应变化
乘法和除法均采用两位符号位来操作。
王道课后题选择题二刷解决:
运算器的主要组成部分包括ALU,移位器,状态寄存器,通用寄存器,数据总线等
模4补码也就是双符号位,我们需要明白,双符号位在计算机中使用一个符号位存储,因为只要它是一个正确的数字,那么他的双符号位的数值就应该是一样的。
A:他更容易检查的是加减运算中的溢出问题
C:只需要一个符号位
D:他只有在逻辑单元中才是两个符号位,也就是在ALU中是
重点!!!!
前置知识点:计算机中的数字用的是补码保存,负数原码变补码的方法是除符号位以外取反加一
但是!!!在计算机中,我们放入ALU中的是原码的反码,也就是说,没有加一的操作,是否加一,是外部的低位进位信息补充,如果是正数,那么低位进位也就是SUB就会给一个0,如果是负数,那么低位进位也就是SUB就会给一个1.所以这道题中的-38给到ALU中时是以11011001的数值给入的