005-【X86-汇编语言】-二进制整数的加减乘除&补码

加法计算

与十进制数字的加法计算相同,二进制数字的加法计算也是按位相加,唯一的不同点是二进制加法是【逢2进1】而十进制加法是【逢10进1】,下面举例 11101 + 11001

从右到左为bit位编号,分别0位、1位、2位、3位、4位、5位,将被加数和加数分别填入下表

bit位 被加数 加数 前一位计算的进位 结果 产生的进位 说明
0 1 1 0 0 1 1+1=10,1进位,0留下作为结果。没有前一位计算所以没有前一位计算的进位,即0
1 0 0 1 1 0 0+0=0,再加前一位计算的进位1,最终等于1,无需进位
2 1 0 0 1 0 1+0=0,前一位计算的进位是0,最终等于1,无需进位
3 1 1 0 0 1 1+1=10,前一位计算的进位是0,最终等于10,1进位,0留下作为结果
4 1 1 1 1 1 1+1=10,再前一位计算的进位是1,最终等于11,1进位,1留下作为结果
5 0 0 1 1 0 无加数与被加数,只保留进位,结果为1

根据上表 11101 + 11001 = 110110

减法计算

二进制的减法计算法则,也与十进制的计算法则一致,唯一的不同点是二进制减法是【借1当2】,而十进制是【借1当10】

下面举例 11100 - 11001

bit位 被减数 减数 前一位的借位 向后一位借位 结果 说明
0 0 1 0 10 1 0-1不够,借一位变成10-1=1,结果为1
1 0 0 1 10 1 0-0=0,因前一位借1变成0-0-1,不够减,借一位变10-0-1=1,结果为1
2 1 0 1 0 0 1-0=1,因前一位借1变成1-0-1=0,结果为1
3 1 1 0 0 0 1-1=0结果为0
4 1 1 0 0 0 1-1=0结果为0

由表得 11100 - 11001 = 11

补码

我们知道减去一个整数等于加上它的相反数,11100 - 11001 = 11100 + (-11001)。但是在计算中存在一个问题,数字的符号也是占bit位的。如果加上符号位 11100 表示为 “011100”,前面补的0表示正数;11001加上符号位表示为“111001”,前面补的1表示负数。两者相加显然不等于11,为了解决这个问题,科学家发明了补码(不要问我,他们是怎么设计出来的,我没有那么聪明的大脑)。

计算机中所有【有符号整数】都是用补码存储和处理的。补码的规则如下

自然数的补码与无符号数的表示方式一致,只是多了一个符号位。如11001的补码为011001,0表示整数。

负整数的补码为其绝对值的补码【按位取反】然后加1,【按位取反】指将原来是1的变成0,原来是0的变成1。

求-11001的补码

扫描二维码关注公众号,回复: 5753286 查看本文章

第一步求其绝对值的补码 = 011001。

第二步绝对值的补码【按位取反】= 100110

第三步【按位取反】后加1 = 100111

所以-11001的补码为100111,故11100 + (-11001) = 011100 + 100111 = 1000011。此时会发现结果还是不等于11呀,这里涉及到一个加法结果有效位的问题,11100和-11001都是5位数,两个5位数相加,不可能得到7位数,最多只能得到8位数。因此1000011的最高位的1是无效的,修正后结果为000011=11

综上所述利用补码表示有符号数就使得加法和减法在计算上达到的统一,这也使得数字电路的设计可以简化。

无符号数也是可用用补码是的加法和减法统一的,只是无符号数在求补码的时候没有符号位罢了。

乘法计算

有了加法计算乘法计算就很简单了,011001 * 3,只需要将011001连续加3次即可

除法计算

有了减法计算除法计算就很简单了,只要将被除数连续地减去除数,直到差小于除数未知,执行减法的次数就是商,最后省下的差就是余数。

猜你喜欢

转载自blog.csdn.net/patronwa/article/details/88184274