详解原码、反码以及补码

很多人都只知道计算机使用的是二进制,但很少有人了解计算机是以补码的方式进行存储数据的,之所以使用补码而不是直接使用二进制实际是为了解决正负运算的问题。

5在二进制中表示为101B(B为二进制单位),如果是在32位计算机中,我们高位补零:

00000000 00000000 00000000 00000101

这个就可以用来在32位计算机中表示数字5,但是如果我们需要表示-5呢?这个时候就出现问题了,因为计算机中没有正负只有0和1,那么要怎么表示-5呢?二进制是没办法直接表示-5的,为了解决这个问题原码就诞生了。

原码:最高位为0为正,1为负,也就是说原码中的正数是一致的,只有为负数时最高位会为1,那么5和-5分别表示为:

00000000 00000000 00000000 00000101 //为5

10000000 00000000 00000000 00000101 //为-5

计算机中并没有减运算,减运算实际是加一个负数的运算,这也就是为什么正数之间的加运算会比减运算快的原因,减运算需要做更多的处理来让计算机解读成能理解的加运算,例如5-5计算机要处理成5+(-5),原码在高位用0和1解决了区分正负的问题,但是又引来的新的问题,因为我们都知道5+(-5)是等于0的,但是我们来看看原码之间的运算结果:

00000000 00000000 00000000 00000101+10000000 00000000 00000000 00000101

=10000000 00000000 00000000 00001010

10000000 00000000 00000000 00001010的原码并不是我们期待的0,而是-10,5+(-5)=-10这肯定不是我们要的结果,不仅如此原码正数高位为0,所有负数高位为1,这个时候会出现两个0的情况,一个为正0,一个为负0,这显然不太合理,0是没有正负的,为了解决第一个问题后来又引入了一个新的概念,那就是反码。


反码:反码是在原码的基础上进一步改进,正数还是同原码及普通二进制一致,但负数则根据该负数的绝对值,也就是正数的原码进行翻转,如果是0就变成1,如果是1则变为0,顾名思义为反码,反码的出现是为了解决正负数的运算问题。

这里实际上是运用了模的概念,例如时钟里的模是12,时钟只有0-11,到12就溢出重新变为0,而在模为12的情况下,要6变为2有两种方法,一种是-4,一种是+8,而4和8又互为补数。

这正好可以解决计算正负号运算问题,因为计算机可以看作计量机器,例如32位计算机的计量范围是0~2^(32)-1,而模是2^(32),这样计算机的正负号运算就可以运用模的性质转化为两个正数相加来达到和正数减去负数一样的结果,从减一个负数变为加这个负数的补数。

从二进制可以轻松的看出,一个正数和自身对应的负数的反码互为补数,因此减去该正数和加上该正数对应的负数的反码结果是一样的。

例如5和-5

00000000 00000000 00000000 00000101 //正数5和上面原码及普通二进制一样的表示

11111111 11111111 11111111 11111010 //-5的反码是5的二进制(或者说原码、反码都可以,因为都一样)0和1的反转

00000000 00000000 00000000 00000101+11111111 11111111 11111111 11111010 

=11111111 11111111 11111111 11111111

这里的11111111 11111111 11111111 11111111是00000000 00000000 00000000 00000000的反码,所以是-0,这样反码的出现就解决了正负数字的运算问题,但是还存在一个问题,就是上面的0是两个,一个为正0,全为0,一个为负0,全为1。为了解决这个问题,又引入了补码的概念。


补码:补码的正数和反码以及原码、普通二进制的一致,没有区别,而负数实际是在原有负数的反码上面+1。

5的反码:00000000 00000000 00000000 00000101

5的补码:00000000 00000000 00000000 00000101


-5的反码:11111111 11111111 11111111 11111010

-5的补码:11111111 11111111 11111111 11111011 //就是在-5的反码基础上+1


00000000 00000000 00000000 00000101+11111111 11111111 11111111 11111011 

=00000000 00000000 00000000 00000000  //5的补码+(-5的补码)=0且0没有正负号


从上面的解释也可以看出来为什么计算机存储数据使用补码而不是直接用二进制,因为二进制不能表示负数,而原码虽然能表示负数,但无法进行正负数运算及两个0的问题,反码解决正负数运算的问题然后还保留着两个0的问题,只有补码完美解决了正负数运算问题同时还解决了两个不同符号的0的问题,因此对于计算机而言,补码是存储的最佳选择。











  • 22
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值