随手笔记-二进制的正负计算
以下计算基于字节单位,由于负数是以补码存储,所以一下负数表示形式皆为补码
1.负数的二进制求法
负数的二进制一般通过正数反推导出,即(正数二进制 -> 取反 -> 补码(加1)),举个例子:
99的二进制为:0110 0011
那么-99的二进制计算方法为
0110 0011 1.取反: 1001 1100 即0转为1,1转为0 2.补码: 1001 1101 即低位加1 那么,1001 1101即为十进制的 -99
有同学要问了,如果低位为1该如何加1?这就是二进制的基础算法了,即逢二进一,举个例子:
98的二进制为:0110 0010 取反:1001 1101 补码:1001 1110 这里1+1等于2了,所以不是相加,而是进一位
那如果是1001 1111,结果就是1010 0000,这里有个规律,即从右向左找到第一个0,然后这个0后的数字全部变为0,而此0加1变为1
2.由负数二进制推正数
其实与正数退负一样,主要就是取反和补码,不过这里有一点概念上的点需要注意,即很多人通过负数进制反推正数时,习惯的按正数推负数的步骤反着来,
即:
-99: 1001 1101 1.低位-1: 1001 1100 2.取反: 0110 0011
这么做的结果固然是正确的,但计算机是不做减法的,计算机的减法其实是加法,即1+(-1),所以我们理解起来正常的逻辑在计算机计算中并不适用
那么按正常的算法,步骤应该为:
-99: 1001 1101 1.取反: 0110 0010 2.补码: 0110 0011
同样的先取反后补码。
这么说可能不太好理解,有网友举出这样一个公式,这样就容易理解了:
正数 + 负数 = 0
正码 + 反码 + 1 = 0
所以,正码取反+1即为反码,反码取反+1即为正码
3.那么,如果正数与负数相加,该如何计算呢
上面我们可以看到,正数99的二进制为0110 0011,正数的原码、反码、补码都是一样的,所以99的补码也是0110 0011,
然后-98的补码为1001 1110,那么,两个进制相加结果:
0110 0011 + 1001 1110 = 1 0000 0001
高位溢出,则舍弃高位,所以结果为:0000 0001,即为10进制的1
至于二进制的加法运算方法,如下:
1.将数字对齐
2.从右向左,上下上下两个数字相加
3.如果不是1+1,即1+0、0+1、0+0,那就直接相加,如果两个数都是1,则1+1=10,结果列写上0,1向上进,这里规则跟普通十进制计算一样,比如13+8,3+8=11,结果列写上1,然后十位数的1向上进,然后1+1 = 2,结果即为21。
4.如果超出位数,则从坐向右舍弃溢出的数字
如果觉得文字表述不清楚,百度经验上有直观的的图片解释:https://jingyan.baidu.com/article/86112f135745432736978776.html