计算机底层存储的基本单位为bit 也就是0与1,数字的表示也是以一串二进制来表示。那么如何通过一连串的二进制来完成计算器的计算功能呢?
何为原码反码补码?
在了解底层加减法之前,先了解下原码反码与补码的区别
整数分为正整数与负整数
怎样根据二进制设定一个数是正数还是负数?根据首位符号:0表示为正数,1表示为负数
正整数的原码反码与补码相等
eg: 1的原码 0000 0001 反码:0000 0001 补码:0000 0001
负整数的原码符号位不变,其他位取反,则为负整数的反码,补码在反码的基础上再加1。
eg: -1的原码 1000 0001 反码:1111 1110 补码:1111 1111
加减法运算
接下来我们通过一个例子1+(-3)来了解底层如何实现加减法(乘除法同理)
由于计算机存储的二进制都为补码,因此在操作之前先计算出1与-3的补码
1: 原码:0000 0001,反码:0000 0001 ,补码:0000 0001
-3:原码:1000 0011 ,反码:1111 1100 ,补码:1111 1101
加减法计算大体分为5部分:
1.求异或^
首先对这俩数求异或操作求值;(啥是异或,俩数的对应位做比较,如果不相等则结果为1,相等则为0)
0000 0001
1111 1101
---------^
1111 1100
求出该值之后记录下来,后边会用到!!
2.求与结果&
紧接着对这俩数进行与操作(对应位的俩数都为1则结果为1,否则都为0),如果求出的与结果为0,则俩数相加结束,计算的结果为上一步的异或所求出的值。如果不为0,则表示需要进位,则对异或的结果进行左移一位操作
0000 0001
1111 1101
---------&
0000 0001
3.左移操作<<
如果第2步与的结果不为0,则左移一位如下所示:
0000 0001
--------- <<1
0000 0010
4.求异或^
紧接着将该值与上一步求出来的异或的结果再次进行异或操作
1111 1100
0000 0010
---------^
1111 1110
5.验证
同2一样,对俩数进行与操作,如果与操作的结果为0,则表示运算结束,结果为上一步的异或值,否则继续重复步骤2
1111 1100
0000 0010
---------&
0000 0000
由于求与的结果为0,则不存在进位,则计算结束,最终的结果为1111 1110;
补码:1111 1110 转为反码(减一):1111 1101 转为原码(符号位不变,其他位取反):1000 0010 转为10进制:-2