您当前的位置:首页 > 计算机 > 编程开发 > 编程箴言

最通俗易懂:负数的二进制为什么要用补码的形式

时间:02-08来源:作者:点击数:

负数的二进制使用码补的形式,即:原码的二进制取反加1。

我们假设使用byte类型,则数据只有8个比特位,负6的二进制形式分3步形成,如下:

在这里插入图片描述

取反就是把0变成1,把1变成0。

所以负6的二进制形式为:1111 1010

有时候我就在想,为什么负数的二进制形式要这么麻烦,比如负6,不能像下面这样子表示吗:

在这里插入图片描述

如上图,最高位的1表示负数,低7位的000 0110表示6,合起来就是负6,这样不是更简单更容易理解吗?

后来,我不经意间发现了一个规律,才明白了负数的二进制形式为什么要用补码的形式。

我们知道1个字节是8个比特位,如果表示无符号数的话,则能表示0 ~ 255,共256个数字,如果是表示有符号数的话,则能表示-128 ~ 127,也是共256个数字。比特位的最高位表示负数,其它位就表示具体的数值,-128是最小的,所以1000 0000这个二进制就表示-128,最高位的1表示是负数,后面的7个0是最小值,就用来表示最小数值-128,这是比较容易理解的。-127比-128大1(-127 > -128),所以-127的二进制形式就比-128多一个1,-127二进制为1000 0001,对应的-126又比-127大1,所以-126为1000 0010。下面多举例几个负数的二进制,如下:

在这里插入图片描述

这几个数值的大小关系为:-128 < -127 < -126 < -125 < -124 < -123 < -122 < -121

通过这个图就能很容易的理解负数的二进制为什么要用补码形式了,因为最高位是表示符号位的,剩余的7位表示数值的大小,-128是最小值,则最高位为1表示负数,低7位只能用最小的000 0000来表示了,-127比-128大1,则-127的低7比-128的低7位就要大1,为000 0001,-126比-127大1,则低7位为000 0010。这样的表示方式就和正数一样了,二进制数值位越大,表示的结果就越大!这样在进行加减法运算时处理就是一样的。

如果要按我们以前的简单理解的话,-128的二进制应该是这样的:

在这里插入图片描述

如上图,最高位1表示负数,剩余的位表示具体数值,则-128一共需要9个比特位。而byte类型只有8个比特位,8个位表示有符号的整数范围是-128 ~ 127,正好256个数字,如果用我们自己的简单理解的话,8个比特位是表示不了-128的,但是可以表示-127,如下:

在这里插入图片描述

如上图,如果按我们的简单理解的话,byte能表示的最小的数为-127,除了符号位,剩下的低7位可以表示 0 ~ 127,共128个数字,如果表示正数,就代表0 ~ 127,共128个数字,如果表示负数,就代表 -0 ~ -127,也是128个数字,但是这里就有问题了,-0的二进制为1000 0000,这是-0的二进制,但是现实中是没有-0的,只有0,0二进制为0000 0000,所以1000 0000要表示一个什么数值呢?我们只道它高位是1,肯定只能表示负数了,它不能表示比-1还要大的负数了,则只能用来表示比-127还小的负数,即-128,然后再配合低7位数值越大,表示的结果就越大,所以1000 0001就表示-127了,因为它比-128大1。然后再来回顾之前的负数二进制列表:

在这里插入图片描述

基于这个规律,才有的负数的二进制形式使用补码形式,这个补码形式是怎么推导出来的我就懒得去想了,反正上面的负数,你用补码形式去推导的话是正好和上面的值相等的,比如-128,推导如下:

在这里插入图片描述

所以1000 0000是-128的二进制形式。

再比如-127,推导如下:

在这里插入图片描述

所以1000 0001是-127的二进制形式。

总结一下:

  • 二进制位分符号位和数值位
  • 数值位中的数值越大,表示的结果就越大。
    • 以byte为例,如果表示负数,则最高位为1,低7位为数值位。
      • 如果低7位是000 0000,是最小值,则表示最小的负数:-128
      • 如果低7位是111 1111,是最大值,则表示最大的负数:-1,-1 > -128,-1是最大的负整数。
      • 这样的表示方式就和正数相同了,即数值位中的数值越大,表示的结果就越大,这也方便我们推导出一些负数的值,比如我们知道-1的二进制为“1111 1111”,如果我们知道了-1的二进制,则很容易推出-2的二进制,因为-2比-1小1,所以负二的数值位对应的要小1,即-2为:1111 1110,-3,则再小1为:1111 1101,所以只要你知道任意一个负数的二进制,你就可以很轻松的推出这个负数相邻的一些负数。
  • 负数使用补码的好处:
    • 可以避免出现-0(负零)的情况
    • 可以把减法变为加法运算,所以在计算机中的减法也是使用加法来实现计算的。

关于补码的更多描述也可以参考百度百科:https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613

补充(2022年03月03日),关于在计算机中是如何用加法来实现减法计算的分析:

负数使用补码形式的一个很大的原因是:使用了补码之后,在计算机的计算中,就没有减法了,用加法运算也能实现减法运算的结果,所以在计算机中只有加法器,没有减法器,减法也是使用加法器来计算的,举例如下:

127 - 128 = -1

这是一个减法运算,“127减128” 可以变为 “127 加负128” ,这样就变成了一个加法运算了,如下:

127 + (-128) = -1

二进制的加法运算如下:

在这里插入图片描述

又比如:1 - 2 = -1,可换算为:1 + (-2) = -1,二进制的计算步骤如下:

在这里插入图片描述

再来一个简单:1 - 1 = 0,可换算为:1 + (-1) = 0,计算过程如下:

在这里插入图片描述

因为byte只有8个比特位,所以上面相加结果的最高位的1其实是会被直接丢掉的,则结果为0000 0000,即结果为0。

再来看2 - 1 = 1,可换算为:2 + (-1) = 1,计算过程如下:

在这里插入图片描述

如上图,去掉多余的最高位,结果为:0000 0001,即结果为1。

OK,这里就不再举例了,大家可以找自己喜欢的减法代进来进行实验,这样我们就深刻理解了负数使用补码的好处了:即用加法来代替减法。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门