补码的详解

本文声明>由于作者水平有限,本文难免有理解不正确之处,如有发现,恳请读者批评指出。


预备知识

本文不会详细阐述二进制、十六进制等,所以你需要提前了解二进制,以及它和其它进制之间的转化。做到能够熟练任意进制之间的转换。

补码

可能你会十分的疑惑,或许也已经看过大量的文章、资料在讲述原码、反码、补码的时候,都会从原码和反码进行说起。既然你还在搜寻这方面的资料,那么说明还有令你困惑的地方,那么本文就给你另外的一种思路去理解补码。不过,也不能保证你看完之后能理解的多么透彻,毕竟我也水平有限,哈哈。

我们知道计算机中所有的数据都是用二进制表示的,计算机在用二进制做加减乘除四则运算的时候是以补码的形式展现的。

计算机虽然能做加减乘除四则运算,但其实在计算机里它的硬件只有加法器,那么既然它只有能够处理加法的硬件,凭什么能够做减法、乘法、除法运算?

就是我们标题所说的通过二进制的补码,它可以把所有的减、乘、除转化成加法运算,其中最根本的问题是减法运算,只要能够把减法运算转化成加法运算,那么,问题就得到解决了。

看一个现实生活中的例子:钟表

或许这个例子你在很多地方有看到,但确实也只有它能够比较说明问题😁

在这里插入图片描述

我们看到现在这个钟表指向了八点钟,如果我们想让他指向七点钟,那么我们可以怎么去调?

没错可以让它往回拨1格,就指向了七点钟了,即:8 - 1 = 7

我们还可以往前拨11格,它也会指向七点钟,即:8 + 11 —> 7

我们可以发现算式 8 - 1 和 8 + 11 最后得到的效果是一样的!

还记得我们的目的是为了解决什么的嘛?减法运算转化为加法运算

在上面这个钟表的系统中,-1和+11的效果是一样,这就完美了解决的了这个问题,以后不管这个钟表指向几点钟,-1后指向的时间,我们都可以通过+11来准确的得到正确的结果。

5 - 1 = 4 就相当于 5 + 11 —> 4

那么,我们就说 -1 的补码就是 11

5 - 2 = 3 就相当于 5 + 10 —> 3
-2的补码就是10

所以只要找到减去一个数的补码,那么所有的减法就都可以变成加法了。

通过上面示例我们可以看出:“求减去一个数的补码,就是用数的范围(个数)减去这个数”

计算机中二进制的补码

计算机中最小的存储单元是bit,byte是计算机中数据处理的最小单位,1byte = 8bit。

后面我们都以8位字长为例来说明二进制补码在计算机中是怎么存储的。

在看二进制补码在计算机中是怎么存储的之前,我们先假设有两个存储单元,看一下十进制我们能如何在这两个存储单元存储。

在这里插入图片描述
每个存储单元可以存放的数字是0~9,数的范围是00 ~ 99 ,一共可以表示的数的个数是100

那么我们看以下算式

25 - 1 = 24,我们如何把它转化成加法运算呢?
还记得我们前面通过钟表的示例得出的 “减去一个数可以加上这个数的补码”,而 “求减去一个数的补码,就是用所能表示数的个数减去这个数”。

也就是说
25 - 1 = 24
相当于
25 + 99 —> 24 (124)

而实际上25+99的得出的是124,而我们用的是两个存储单元进行存储,根本就存不下124,所以最高位就被舍弃了。
在这里插入图片描述
从这我们可以看出计算机它是如何把减法运算通过补码转化成加法的;对于补码,我们刚刚是通过用可以表示数的个数减去这个数来计算的,而计算机有专门的硬件可以把这个数转化成补码形式(这个后面我们会了解到)

我们还可以把它变得更简单一些,用1个字长来表示十进制的数,那么数的范围就是0~9;一共10个数

这0~9的十个数中,有的是表示它真实的意义,有的表示的是补码,也就是说,当我们在这个位看到了一个9的时候,它真实表示的其实是-1,看到一个6的时候,它真实表示的是-4。
在这里插入图片描述
表示的范围就是-5~4

接下来我们就回到我们的二进制中,就以计算机的一个字节为例,也就是8个比特。可以表示数的范围是:0~255,一共可以表示256个数。

先看下下面的计算
在这里插入图片描述

所以在我们的八位二进制的补码系统里面
在这里插入图片描述

对于原码和反码其实它们并没有什么本身的意义,只是为了比较容易计算补码出现的,就像我们把十进制转化成二进制使用的短除法那样,只是为了让我们更容易的去计算二进制,原码反码本身也没有意义。

在这里插入图片描述
我们发现表示真实意义的这一串数它们的最高位都是0,而表示补码形式的数它们的最高位都是1,如果在计算机里面看到一个二进制的数存储空间里面存储的二进制数最高位是1的话,这个数一定是补码的一个数,如果是0,这个数一定表示它真实意义的数。

根据这个特征,我们在计算补码的时候就非常容易计算。

比如说求-3的补码:
求-3的原码: 10000011
求-3的反码: 11111100 (符号位不变,其余位取反(计算机有专门的运算器来做取反工作,非常的快))
求-3的反码: 11111101(在反码的基础上+1)

我们可以通过用“求一个数的补码,用可以表示数的个数减去这个数”来验算一下
256 - 3 = 253;11111101 这个二进制是不是253呢?111111111是255,再减去2得到11111101

通过上面那三个步骤为什么就能算出补码呢?

我们真实的去算这个补码是用256-3来得到的。
可以把256-3分成两个步骤:
255 - 3 = 252
255 + 1 = 253

255的二进制:
11111111
3的二进制:
00000011

相减得到:
11111100 (得到的就是反码)

然后再+1的话得到:
11111101 (补码)

所以根据原码反码,我们就可以非常快的算出补码,而对于计算机在求反码的时候,又有专门的硬件来处理。所以效率是非常的高的。而在我们学习的过程中,原码和反码并没有太多的意义,仅仅是为了更加容易的计算补码。

  • 17
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值