详解原码、反码以及补码

1.定义:

所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

2.

原码:最高位为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的问题,因此对于计算机而言,补码是存储的最佳选择。

转载:https://blog.csdn.net/belen_xue/article/details/80068913

猜你喜欢

转载自blog.csdn.net/qq_39503189/article/details/82830170