前置总述
1.计算机硬件实际运算几乎不用原码、反码,有符号数统一使用补码完成加减;反码仅作为原码↔补码转换中间产物。
2.所有减法均可等价转换为加法,硬件只需一套加法器,无需单独减法器。
3.运算会出现溢出:同号有符号数相加才溢出;无符号数加减依靠最高进位判断溢出。
4.无符号数底层运算逻辑和补码完全一致,共用同一套加法器电路。
第一部分 定点数移位运算
一、十进制移位类比
左移 R 位 = ×10^R;右移 R 位 = ÷10^R
二进制同理:左移 R 位 = ×2^R;右移 R 位 = ÷2^R
二、逻辑移位(无符号整数专用)
1.逻辑左移
高位丢弃,低位补 0;移出位为 1 会发生溢出,数值出错
2.逻辑右移
低位丢弃,高位补 0;丢弃位为 1 会丢失小数精度
三、算术移位(有符号补码专用,最高位为符号位)
1.算术左移
高位丢弃,低位补 0;符号位改变 = 溢出
2.算术右移
低位丢弃,高位补符号位(正数补 0,负数补 1);丢弃 1 丢失精度
第二部分 原码加减运算(仅理论,硬件不采用)
一、原码加法四种情况(核心:分开符号、只对绝对值运算)
设两数真值为 X、Y,原码仅数值位存绝对值,符号位单独处理
1.X 正、Y 正
绝对值相加,结果符号为正。
2.X 负、Y 负
绝对值相加,结果符号为负。
3.X 正、Y 负 / X 负、Y 正(异号)
用绝对值大的数 - 绝对值小的数;结果符号和绝对值更大的数保持一致。
二、原码减法规则
X - Y = X + (-Y)
只需将减数 Y 的符号位取反,直接套用上面原码加法逻辑。
三、原码运算缺陷
1.四种符号组合需要多路判断逻辑,硬件电路极其复杂;
2.仅同号相加会产生溢出,异号相加永远不会溢出;
3.存在 + 0、-0 两种编码,浪费存储空间。
因此计算机不使用原码做加减,统一采用补码。
第三部分 补码加减运算(硬件标准实现,重中之重)
一、补码加法:A 补 + B 补 = A+B 补
核心特点:符号位和数值位一同参与运算,无需单独处理符号
示例:8 位机器字长,A=15,B=-24
1.写出 A、B 真值,转为 8 位原码;
2.原码求补码:正数补码 = 原码;负数原码数值位取反 + 1;
3.两个补码全部位直接相加,包含符号位;
4.相加结果为 A+B 补,再转回原码得到最终真值。
二、补码减法:A - B = A + (-B)
关键操作:由 B 补求 -B 补(求补运算)
两种等价方法:
1.全部二进制位(符号位 + 数值位)按位取反,末位 + 1;
2.快速法:从右往左找到第一个 1,该 1 右侧所有位不变,左侧全部位取反。
三、补码转换速记
负数补码转原码,规则和原码转补码完全相同:取反加 1。
四、溢出基础概念
8 位补码表示范围:-128 ~ +127
1.上溢:两个正数相加,结果超出正数最大值(>127),运算结果符号变为负数;
2.下溢:两个负数相加,结果小于最小值(<-128),运算结果符号变为正数;
3.核心规律:只有同号数相加才会溢出;一正一负相加绝对无溢出。
第四部分 补码加法三种硬件溢出判断方法
一、方法 1:单符号位,符号逻辑判断(逻辑表达式)
设 As:被加数符号,Bs:加数符号,Ss:结果符号
(-As表示As的非)
溢出条件 V = -As-BsSs+AsBs-Ss
•-As-BsSs:两个正数 (0+0),结果符号为 1(负数)→上溢
•AsBs-Ss:两个负数 (1+1),结果符号为 0(正数)→下溢
V=1 代表溢出,V=0 无溢出;表达式可直接用与门、或门、非门搭建电路。
二、方法 2:单符号位,进位异或判断(最常用)
定义:
CP:最高数值位向符号位产生的进位
CS:符号位向更高位产生的进位
溢出判断:V = CP ⊕ CS
1.CP=1,CS=0 → 上溢(正数相加溢出)
2.CP=0,CS=1 → 下溢(负数相加溢出)
3.CP、CS 相同(同为 0 / 同为 1)→ 无溢出
三、方法 3:双符号位补码(模 4 补码)
1.表示规则:正数符号 00,负数符号 11;运算时两位符号位全部参与计算。
2.判断规则:运算后两个符号位异或,结果为 1 则溢出
○结果符号 01:上溢(本该正,实际算出负)
○结果符号 10:下溢(本该负,实际算出正)
○结果符号 00/11:无溢出
3.补充概念
○单符号位补码:模 2 补码;双符号位:模 4 补码
○硬件存储仅存 1 位符号位,运算前复制一份符号位,不增加存储开销。
第五部分 无符号数加减运算
一、底层运算逻辑(和补码完全一致,共用加法器)
(1)无符号加法
两数所有二进制位直接逐位相加,低位向高位进位正常传递。
(2)无符号减法:A - B = A + B 的补数
N 位无符号数天然模2^N(8 位模 256)
求 B 的补数操作:B 全部位按位取反,末位 + 1
减法转换为加法,统一由加法器完成。
二、无符号数溢出判断
手算做题法(考试首选)
N 位无符号数范围:0∼(2^N)−1
1.加法:十进制求和 > (2^N)−1 → 溢出
2.减法:十进制结果 < 0 → 溢出
硬件电路判断(依靠最高进位 Cout)
1.无符号加法:最高位产生进位 Cout=1 → 溢出;Cout=0 正常
2.无符号减法(已转加法):最高位进位 Cout=0 → 溢出;Cout=1 正常
第六部分 补码加减运算硬件电路(带 SUB 控制信号加法器)
一、电路组成
N 位并行加法器、多路选择器、一组非门、控制信号 SUB
•SUB=0:执行加法;SUB=1:执行减法
二、加法流程(SUB=0)
1.多路选择器直接输出原加数 Y;
2.加法器最低位进位 Cin=0;
3.输入 A、Y 逐位相加,输出和,产生最高进位 Cout。
三、减法流程(SUB=1)
1.Y 经过非门全部按位取反;
2.多路选择器输出取反后的 Y;
3.加法器最低位进位 Cin=1(实现末位 + 1,完成求补);
4.等价完成 A + -Y 补,实现减法。
四、拓展:电路同时支持无符号数运算
无符号数加减底层运算规则和补码完全相同,该加法器一套电路通用。
第七部分 运算标志位(OF/SF/ZF/CF)必考
一、OF 溢出标志(有符号数专用)
生成逻辑:最高数值位进位 CP ⊕ 符号位进位 CS
OF=1:有符号加减溢出;OF=0:无溢出
二、SF 符号标志(有符号数专用)
直接取运算结果最高位(符号位)
SF=1:结果为负数;SF=0:结果为正数
三、ZF 零标志
所有运算结果位做或非运算
ZF=1:运算结果全 0;ZF=0:结果非 0
四、CF 进位 / 借位标志(无符号数专用)
生成逻辑:Cout(最高进位)⊕ Cin(最低进位)
•加法 Cin=0:CF=1 代表 Cout=1,无符号加法溢出
•减法 Cin=1:CF=1 代表 Cout=0,无符号减法溢出
CF=1:无符号运算溢出;CF=0:无溢出
第八部分 复习速记总结
1.逻辑左 / 算术左:规则完全一致,高丢低补 0
2.逻辑右:高位统一补 0;算术右:高位补符号
3.左移等价乘 2、右移等价 2;左移防溢出,右防精度丢失
4.有符号运算只用补码,减法 = 加负数补码;符号位参与运算。
5.溢出区分:有符号看 OF;无符号看 CF;同号相加才会有符号溢出。
6.三种溢出判断:符号逻辑、进位异或、双符号位。
7.无符号数模2N,减法靠补数转换加法,电路和补码加法器通用。
8.四大标志位:OF 判有符号溢出、SF 判正负、ZF 判零、CF 判无符号溢出。
9.加减硬件靠 SUB 控制信号实现,SUB=0 加、SUB=1 减,取反 + 最低进位 1 完成求补。