基本逻辑运算:
运算优先级:与>或
符号表示 | 表达式 | 门电路 | 备注 | |
与 | && | | | 都为真才为真 |
或 | || | | | 都为假才为假 |
非 | ! | | | 真为假、假为真 |
与非 | | | 先与后非 | |
或非 | | | 先或后非 | |
异或 | | | 相同为0,不同为1 |
2.2.1 基本运算部件
各部件在不同算术运算中存放的数字:
加 | 减 | 乘 | 除 | |
ACC | 被加数、和 | 被减数、差 | 乘积高位 | 被除数、余数 |
MQ | 乘数、乘积低位 | 商 | ||
X | 加数 | 减数 | 被乘数 | 除数 |
1. 带标志加法器
OF(溢出标志)=Cn⊕Cn-1 (只在有符号加减运算才有意义)
Cn:符号位进位
Cn-1:数值位最高位进位
SF(符号标志:和的符号)=Fn-1(只在有符号加减运算才有意义)
ZF(零标志):ZF=1(当且仅当F=0)
CF(进位/借位标志)=Cout⊕Cint(Sub)(只对无符号数加减法有意义)
CF为1时说明无符号加减法发生了进位或借位,发生溢出
2. 算术逻辑单元
核心:带标志加法器
ALU:组合逻辑电路、基本部件并行加法器
2.2.2 定点数的移位运算
两者不同:右移时不同、溢出判定不同
相同:左移低位都补0
1. 逻辑移位(无符号移位)
左移:高位移出、低位补0(高位有1则发生溢出)
右移:低位移出、高位补0
2. 算术移位(有符号补码移位、符号位)
左移:高位移出、低位补0(左移前后符号位不同则溢出)
右移:低位移出、高位补符号位(低位有1移出则丢失精度)
2.2.3 定点数的加减运算(字长:n+1)
1. 补码的加减法运算
特点:
- 逢二进一
- 加法则补码相见,减法则加上减数补码
- 符号位与数值位一起参与运算
- 运算结果高位丢弃(保留n+1位)
2. 溢出判别方法
三种溢出判别方法均需要溢出判别电路(使用异或门实现)
只有同号的数相加、异号的数相减才能溢出
上溢:正数+正数
下溢:负数+负数
- 采用一位符号位(模2补码)
加数和被加数符号相同与结果的符号不同则溢出
设A的符号As,B的符号位Bs,运算结果的符号位为Ss,
溢出逻辑表达式:
V=0:无溢出;V=1:溢出
- 采用双符号位(模4补码)
运算结果两个符号位:Ss1Ss2
-
- Ss1Ss2=00:结果为正数,无溢出
- Ss1Ss2=01:结果为正溢出(上溢)
- Ss1Ss2=10:结果为负溢出(下溢)
- Ss1Ss2=11:结果为负数,无溢出
溢出逻辑表达式:
V=0:无溢出,V=1:溢出
- 采用一位符号位根据数值位的进位情况判断溢出
符号位(最高位)的进位Cn与最高数位(次高位)的进位Cn-1相同,无溢出,否则溢出
溢出逻辑表达式:
V=0:无溢出;V=1,Cn=0,Cs=1:上溢;V=1,Cn=1,Cs=0:下溢
3. 加减运算电路
运算器本身无法识别二进制串是有符号还是无符号数
2.2.4 定点数的乘除运算(字长:n+1)
乘法 | 除法 | ||||
原码 (求x*y) | 定点一位乘法 | 乘数被乘数都取绝对值,符号位单独处理,最后符号由两数符号位异或决定 | 恢复余数法 | (一位符号位)商尝试上1,被除数x+[-|y|]补: 结果<0,商为0,+[|y|]补后左移移; 结果>0,商1,左移 | |
加减交替法 | (一位符号位)商尝试上1,被除数x+[-|y|]补: 结果<0,商0,左移+[|y|]补; 结果>0,商1,左移+[-|y|]补 | ||||
补码 求([x*y]补) | 定点一位乘法 | 经典 | 乘数是补码。 最低位为1,+[x]补后右移; 为0,+0后右移; 若y为负数+[-x]修正 | (两位符号位)+[y]补: 结果和y同号,商1,左移+[-y]补; 结果和y异号,商0,左移+[y]补 | |
布斯 | 乘数是补码+辅助位0。 最低位-次低位为1,+[x]补后右移; 为-1,+[-x]补右移; 为0,+0右移 |
1. 定点数乘法
1.1. 定点一位乘法
1.1.1. 原码定点一位乘法:
乘数被乘数都取绝对值,符号位单独处理,最后符号由两数符号位异或决定
eg:x=-0.1101,y=0.1011,求x*y:
1.1.2. 补码定点一位乘法:
经典:乘数是补码
最低位为1,+[x]补后右移;为0,+0后右移;若y为负数+[-x]补修正(YnX+Yn-1X+...+Y0X)
布斯:乘数是补码+辅助位0
最低位-次低位为1,+[x]补后右移;为-1,+[-x]补右移;为0,+0右移
eg:x=-0.1101,y=0.1011,求x*y:
2. 定点数除法
2.1. 恢复余数法
商尝试上1,+[-|y|]补:结果<0,商为0,+[|y|]补(将减去的数补回)后左移移;结果>0,商1,左移
流程图:
eg:x=0.1011,y=0.1101,求x/y:
2.2. 加减交替法(不恢复余数法)
对恢复余数法的优化
2.2.1. 原码加减交替法
商尝试上1,被除数x+[-|y|]补:结果<0,商0,左移+[|y|]补;结果>0,商1,左移+[-|y|]补
eg:x=0.1011,y=0.1101,求x/y:
2.2.2. 补码加减交替法
+[y]补,结果和y同号,商1,左移+[-y]补;异号,商0,左移+[y]补
补充
阵列乘法器:阵列每一行输入乘数的每一位,无需循环乘以乘数的每一位
C语言中:
定点整数采用补码进行存储
符号和无符号数同时参与运算时统一按无符号数进行计算
参考文献:
2025计算机组成原理考研复习指(王道论坛)
计算机组成与结构(王爱英)