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

1.负数的二进制求法

  负数的二进制一般通过正数反推导出,即(正数二进制 -> 取反 -> 补码(加1)),举个例子:

  99的二进制为:‭0110 0011‬

  那么-99的二进制计算方法为

  1.         0110 0011
  2.    1.取反: 1001 1100  即0转为11转为0
  3.    2.补码: 1001 1101  即低位加1
  4.    那么,1001 1101即为十进制的 -99

  有同学要问了,如果低位为1该如何加1?这就是二进制的基础算法了,即逢二进一,举个例子:

  1.   98的二进制为:0110 0010
  2.       取反:1001 1101
  3.       补码:1001 1110  这里1+1等于2了,所以不是相加,而是进一位

  那如果是1001 1111,结果就是1010 0000,这里有个规律,即从右向左找到第一个0,然后这个0后的数字全部变为0,而此0加1变为1

 

2.由负数二进制推正数

  其实与正数退负一样,主要就是取反和补码,不过这里有一点概念上的点需要注意,即很多人通过负数进制反推正数时,习惯的按正数推负数的步骤反着来,

  即:

  1.   -99:     1001 1101
  2.  
  3.   1.低位-1:   1001 1100
  4.  
  5.   2.取反:    0110 0011

  这么做的结果固然是正确的,但计算机是不做减法的,计算机的减法其实是加法,即1+(-1),所以我们理解起来正常的逻辑在计算机计算中并不适用

  那么按正常的算法,步骤应该为:

  1.   -99:     1001 1101
  2.  
  3.   1.取反:    0110 0010
  4.  
  5.   2.补码:    0110 0011

 

  同样的先取反后补码。

  这么说可能不太好理解,有网友举出这样一个公式,这样就容易理解了:

  正数 + 负数 = 0

  正码 + 反码 + 1 = 0

  所以,正码取反+1即为反码,反码取反+1即为正码

3.那么,如果正数与负数相加,该如何计算呢

  上面我们可以看到,正数99的二进制为0110 0011‬,正数的原码、反码、补码都是一样的,所以99的补码也是0110 0011‬,

  然后-98的补码为1001 1110,那么,两个进制相加结果:

  1.       0110 0011
  2.  
  3.   +    1001 1110
  4.  
  5.   =   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

版权声明:本文为nvsky原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/nvsky/p/11465795.html