【计算机编码】《怎么表示反码、补码(以8bit为例)》


《怎么表示反码、补码(以8bit为例)》

〇、总论
计算机当中数值的表示全部采用补码的形式。
引入原码、反码这种计算机制,只是为了方便我们求出补码。它们都只是心智上的东西,计算机中并不存在。
(所以“正数的原码、反码、补码都相同”,这句话只是为了便于我们去计算而背诵的。它在计算机内部工作的实现原理上并不符合其设计构思的实际情况。
其设计构思只是在考虑如何表示负数,避免出现减法运算,以简化电路,并没有去关心正数的问题。)

 

一、为什么需要反码
因为1就是0000 0001。
根据1+(-1)=0的原则,-1=0-1=0000 0000-(0000 0001);
为了方便计算,虚构出一个已经出现内存溢出的数值1 0000 0000;
那么-1=0-1=1 0000 0000-0000 0001=1111 1111,这就是计算机中-1的表示方式;
同理-2、-999等负数的表示方式也可以这么计算出来。
我们给这个用以表示负数的运算人为取了一个名字:反码。

 

二、为什么(负数的)补码是反码+1
计算机的存储器是一个模系统,它会因数据溢出而出现数值的不断循环。
好比时钟一圈12小时,往后拨5小时与往前拨7小时是等效的;

现在换成1个字节,一整圈以255为循环(+0和-0重叠),-5和+250等效;
补码把0的重叠问题解决了,一整圈以256为循环,-5和+251等效。

用8位二进制反码表示的正数范围:+0~+127;
负数范围:-127~-0。
但是,其中有两个特殊的编码会出现:
0000 0000=+0 (反码)
1111 1111=-0 (反码)
+0和-0代表的都是0。这样一来,0这个数字在计算机中的编码就不是唯一的了。
对于计算机来说,这是绝对不行的,因为任何数字都只能有1个编码。

●解决办法:
把0当成正数,即+0。那8位二进制表示的正数范围仍然是:+0~+127。
但是,对于负数就必须要做调整,因此-0必须要让位,即1111 1111这个编码不能表示-0。
我们可以把负数整体向后挪动1位,将8位二进制表示的负数范围从:-0~-127变成:-1~-128。
那么整体挪动1位的方法就是反码+1。
1111 1111编码就不再表示-0,而变成了-1;顺着推,最小的编码1000 0000就是-128。
我们给这个“反码+1”人为取了一个名字:补码。

posted @ 2022-01-09 13:06  BearKuma1069  阅读(509)  评论(0)    收藏  举报