在加减乘除运算中,使用原码进行运算的电路实现太难,多采用补码来进行加减乘除。
补码:正数的补码与原码一样。负数的补码是原码符号位不变,数值位全部取反,再加1。
例如: | 108 | -108 |
---|---|---|
原码 (最高位即最左一位是符号位。 正数的符号位:0。 负数的符号位:1。) | 0 110 1100 | 1 110 1100 |
反码 (正数的反码:同原码。 负数的反码:原码符号位不变,数值位全部取反) | 0 110 1100 | 1 001 0011 |
补码 (正数的补码:同原码。 负数的补码:反码+1) | 0 110 1100 | 1 001 0100 |
(补码)加法运算
二进制逢2进1,符号位参与加法运算。
补码的加法运算结果仍是补码,需转为原码。(正数:原码=补码。负数:符号位不变,数值位全部取反,再+1)
加法运算可能溢出
正数与正数相加,可能溢出;负数与负数相加,可能溢出。
例如:8位二进制,其中1位符号位,数值最大127。108+30=138>127,溢出。
判断是否溢出
方法一:一位符号位。通过将结果的符号位与原来两个符号位比对(与或非)。
若判断结果为0,没有溢出;若结果为1,则溢出。
方法二:一位符号位。符号位进位Cs与数值位最高位进位C1比对(异或)。
方法三:双符号位。结果的两个符号位比对(异或)。
注:实际存储时,只有一个符号位。运算时,复制一个符号位。
如何解决溢出(位宽扩大,也有称为:符号扩展)
正数
原码、反码、补码一样,扩宽方式也一样。
正整数:符号位与数值位中间扩宽,补0。正小数:数值位低位后面扩宽,补0。
负数
负整数:原码:符号位与数值位中间扩宽,补0。
反码:符号位与数值位中间扩宽,补1。
补码:符号位与数值位中间扩宽,补1。
负小数:原码:数值位低位后面扩宽,补0。
反码:数值位低位后面扩宽,补1。
补码:数值位低位后面扩宽,补0。
(补码)减法运算
A-B相当于A+(-B),转为加法运算。
既是加法运算,就可能溢出(例如:108-(-30)相当于108+30),判断溢出与解决上面已说明。
(原码)乘法运算
相当于多次加法运算。涉及:加法(原码)、逻辑右移、异或。
(原码)乘法运算的符号位:(异或)
符号位不参与运算。最终结果的符号位:被乘数和乘数的符号位异或。
(原码)乘法运算初始:
ACC(累加寄存器):0000 0000,
MQ(乘商寄存器):乘数绝对值,
X(通用寄存器):被乘数绝对值。
(原码)乘法运算过程:(加法、逻辑右移)
第一步、MQ(乘商寄存器)的低位若为1,ACC(累加寄存器)中的值加上X(通用寄存器)中的值;若MQ的低位为0,ACC中的值加上0。
第二步、ACC中的值和MQ中的值一起逻辑右移(低位舍弃,高位补0)。
第三步、重复第一步、第二步。
第四步、修正符号位(ACC中)。
(原码)乘法运算最终结果:
ACC(符号位,乘积的高位),MQ(乘积的低位)。
(补码)乘法运算
相当于多次加法运算。涉及:加法(补码)、算术右移。
ACC和X中使用双符号。MQ中低位后面有一位辅助位。
(补码)乘法运算的符号位:
被乘数和乘数的符号位参与运算。且双符号位(存储时是1位符号位,运算时复制符号位)。
(补码)乘法运算初始:
ACC(累加寄存器):00 000 0000,
MQ(乘商寄存器):乘数补码,低位后面有一位辅助位0,
X(通用寄存器):被乘数补码,双符号。
(补码)乘法运算过程:(加法-补码、算术右移)
第一步、MQ(乘商寄存器)的辅助位减数值位低位,若为1,ACC(累加寄存器)中的值加上被乘数的补码;若为0,ACC中的值加上0;若为-1,ACC中的值加上被乘数相反数的补码。
第二步、ACC中的值和MQ中的值一起算术右移(低位舍弃,符号位为0,高位补0,符号位为1,高位补1)。
第三步、重复第一步、第二步。
第四步、多做第一步的加法(符号位参与运算)。
(补码)乘法运算最终结果(仍是补码):
ACC(符号位,乘积的高位),MQ(乘积的低位)。
补充
0:假。1:真。
与运算
与运算中,都为1(真),结果才为1(真),其余情况结果均为0(假)。
条件1 | 条件2 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
或运算
或运算中,都为0(假),结果才为0(假),其余情况结果均为1(真)。
条件1 | 条件2 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
非运算
非运算中,相当于取反,为0(假)则结果为1(真),为1(真)则结果为0(假)。
条件 | 结果 |
---|---|
0 | 1 |
1 | 0 |
异或运算
异或运算中,相同,结果为0(假);不同,结果为1(真)。
可理解为:判断是否仅有一个为1(真)。
条件1 | 条件2 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
异或运算(可用与、或、非实现)
加法运算(异或、与、或)
本位和:两个本位跟低位进位的异或。可理解为:3者中偶数个1则结果为0,否则为1。
进位:两种情况满足一个即可。1、两个本位都为1则进位(即两个本位进行与运算结果为1)。2、两个本位只有一个1,且低位进位为1,则进位,(即两个本位异或运算结果为1,然后和低位进位进行与运算结果为1)