购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 数据编码

2.2.1 原码

原码就是原来的码,如图2-1所示,以8位二进制为例,用最高位表示符号,图中以下划线来区分,1为负,0为正,剩余的7位是真值的绝对值,即用第一位表示符号,其余位表示数值。原码是人脑最容易理解和计算的一种形式,为什么呢?

图2-1 原码编码示意图

从原码的编码能够看出,无论正数还是负数,除了符号位外,表示数值的二进制位(剩余的7位)都是随着真值绝对值的增加而增加,如图中三角形表示的趋势一样,向数值坐标轴两边逐渐增大,这和人类的计数习惯一致的,容易理解和记忆。但是,原码的编码方式存在一个缺点,大家知道,8位二进制实际上可以表示的状态数是2 8 (256)个,但实际上,原码表示的数的范围仅为-127~127,总共可表示255个数,中间的“+0”和“- 0”为一个数,即“0”值,但却用两个状态( 0 000 0000)和( 1 000 0000)来表示,浪费了一个状态的资源。所以这种编码方式无法实现计算机二进制数与人类使用的十进制数的一一映射关系,二进制可以映射为十进制,但是当十进制映射为二进制时,就会出现一个“0”对应两个二进制的问题,存在表述不明的隐患,无法用于计算机的运算。可参考二维码视频讲解。

2.2.2 反码

反码就是取反获得的编码。正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反,如图2-2所示。

图2-2 反码编码示意图

[+5]=[0000 0101] =[0000 0101]

[-5]=[1000 0101] =[1111 1010]

从上面可以看出,如果一个反码表示的是负数,人脑无法直接识别,需要转化计算一下才能看出来。

反码与原码不同之处在于表示负数时,除了符号位外,表示数值的位随着真值绝对值的增加而减小,如图中左边三角形表示的趋势一样。例如,-127对应的二进制数为1000 0000,去掉最高位符号位1后,二进制表示的数为000 0000(0);-1对应的二进制数为1111 1110,去掉最高位符号位1后,二进制表示的数为111 1110(126)。反码的

编码方式与原码相似,8位二进制可以表示的状态数仍为255个,范围是-127~127,中间的“+0”和“-0”对应的状态分别用( 0 000 0000)和( 1 111 1111)来表示,同样浪费了一个状态的资源。

但反码比原码有一个优势,就是它更能让计算机发挥优势。因为对于计算机,加减运算是最基础的运算,在计算过程中,让计算机再辨别“符号位”显然会增加计算机基础电路设计的复杂性,于是人们想出了将符号位也参与运算的方法。根据运算法则可知,减去一个正数等于加上一个负数,即1-1=1+(-1)=0,所以机器可以只进行加法运算而不用减法,这样计算机运算的设计就更简单了。

但是用原码无法实现上述的设计,大家看下面这个例子。

计算十进制的表达式:1-1=0

1-1=1+(-1)=[0000 0001] + [1000 0001] = [1000 0010] =-2

从上面的运算过程可以看出,如果采用原码,让符号位参与计算,显然对于减法来说结果是不正确的,这也就是为什么计算机内部不使用原码表示一个数的原因。

为了解决原码无法做减法的问题,出现了反码。即

1-1=1+(-1)=[0000 0001] + [1111 1110] = [1111 1111] = -0

这样看来,用反码计算减法,结果的真值部分是正确的,剩下唯一的问题就出现在“0”这个数值上。无论是原码还是反码,0都会被表示为+0和-0,只是在原码和反码中表示“-0”的二进制数不同。但是,“0”带符号是没有任何意义的,一个十进制数同样面临出现两个二进制数映射关系的问题,产生不确定性,这是原码和反码所不能解决的,必须改进编码方式,解决0有两个编码的问题,于是,补码出现了。可参考二维码视频讲解。

图2-3 补码编码示意图

2.2.3 补码

正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,然后加1(在反码的基础上加1),例如:

[+1]=[0000 0001] = [0000 0001] = [0000 0001]

[-1]=[1000 0001] = [1111 1110] = [1111 1111]

补码的编码方式如图2-3所示,从“-0”开始,所有的负数都向左平移了一位,“-0”的二进制数表示“-1”;“-1”的二进制数表示“-2”,…,“-127”的二进制数表示“-128”。将“+0”和“-0”值重叠的两个状态分开,向数值的下限延伸了一个,即有了“-128”这个数值。所以,用补码表示的范围是:-128~127,正好2 8 (256)个状态,实现了十进制数与二进制数的一一对应。可参考二维码视频讲解。 aeNknEH177B7QhAPJT5jWK3J+ysoRnFxn9ZUl/XOaTG8YYOBxhN+MK0OtJygkCJa

点击中间区域
呼出菜单
上一章
目录
下一章
×