随手笔记-二进制的正负计算

以下计算基于字节单位,由于负数是以补码存储,所以一下负数表示形式皆为补码

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

原文地址:https://www.cnblogs.com/nvsky/p/11465795.html