本章学习计算机中如何表示基本数据。
目录
机器数分类及其表达方式
机器数分为定点数和浮点数。对于机器数,由于使用一串二进制位来表示数据,因此转化方式就决定了不同机器数的特点。机器数的三个主要特点如下:
- 支持数据类型
- 支持数据大小
- 支持数据精度
下面看看定点数和浮点数的区别。
定点数
定点数据一般用于表示整数和定点小数。很明显的,定点数据的支持数据大小和其位数有关。比如高级语言中的32位int数据,可以表示-2^31+1~2^31的数据,而long long 数据则是64位的,表达范围增大。
定点数据有四种表示方式:原码、反码、补码和移码。
- 原码:最简单的表示方式,使用最高位做符号位,剩余位表示该数大小。虽然表示简单,但是运算相对复杂,而且0的表示不唯一(取8位原码为例,10000000和00000000都可以表示0,一个是+0,一个是-0.)
- 反码:表示复杂,使用最高位做符号位,当最高位为1时,剩余位为对应原码取反。这样运算相对简单一些,但是0的表示方式依然存在+0和-0两种(11111111和00000000)。
- 补码:表示复杂,使用最高位做符号位,当最高位为0时和原码相同,为1时剩余位为对应反码+1.这个+1非常重要,因为他简化了计算,这样补码数据就可以直接相加,运算比较简单。(参见下一章“运算方法和运算器”内容)
- 移码:通常用于表示表示浮点数的阶码。同一个数的移码和补码的符号位相反,剩余位相同,
浮点数
浮点数一般用于表示小数位数不确定的小数。当表示一个浮点数时,整个数据分为三部分:符号位S,阶码部分E和尾数M。其中,符号位S表示该数的正负,阶码E表示这个数的大小,尾数M表示这个数的精度。对于32位单精度浮点数来说,一般E有8位而M有23位,而对于64位双精度浮点数来说,E有11位而M有52位。总的来说,假设浮点数为N,那么其可以用以下公式表示:
(单精度)
(双精度)
其中,对于E和M的特殊情况,做出如下规定:
- 当E=0,M=0时,表示机器0.
- 当E=0,M≠0时,表示非规格浮点数(需要进行规格化)
- 当1≤E≤254时,表示规格浮点数
- 当E=255,M=0时,表示无穷大Inf
- 当E=255,M≠0时,表示非数值结果NaN
例如:将20.59375转化为32位IEEE754格式的浮点数。
20.59375 = 10100.10011 = 1.010010011 * 2^4
那么可以得到:
S=0
E=10000011
M=01001001100...0
S+E+M既可以得到IEEE754格式的浮点数:
结果化成16进制为:
41A4C000H
机器数的校验
奇偶校验
奇偶校验又分为奇校验和偶校验。其中,偶校验在传输数据中1的数据为偶数时校验位为1,否则为0;奇校验则相反。
奇偶校验有着以下两个特点
- 编码与检错简单
- 编码效率高
但是奇偶校验也有两个非常严重的问题:
- 不能检测偶数位的错误。
- 不能定位错误。
- 改进奇偶校验不能检出顶点位的错误。
下面的例子说明了奇偶校验的特性。红色的是发生错误的编码,但是改进奇偶校验不能检出是在哪一行,只能检出是在哪一列。
奇校验 | ? | ? | 行校验位 | |||||
0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | |
1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | |
0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | |
1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | |
1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | |
列校验位 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
奇偶校验主要应用于传输过程中。当使用同步传输时,一般采用奇校验;当使用异步传输时,一般使用偶校验。
CRC校验
假设要校验的信息有k位,而被校验的信息有r位。那么,CRC中的k和r满足下列公式:
所以,CRC校验的第一步是确定r的位数。
第二步:确定生成多项式G(x):生成多项式必须满足如下需求:
- 至少有(r+1)位
- 最高位和最低位均为1
- 任一位发生错误时,被生成多项式做除后余数不为0
- 不同位发生错误时,模2的余数不同。
第三步:确定r的具体数值。
现在k位编码逻辑左移r位,使用上商方法除以生成多项式,得到的余数就是r的具体数值。
现在,将k位编码和r位校验码组成新串进行校验,如果编码没有错误,得到的余数应该是0.
第四步:检错
假设出现了错误,生成多项式相除会留下余数,可以对照生成多项式余数对应的错误位来寻找。
CRC校验的硬件实现方式是循环使用异或运算来实现的(当最高位为1时如上)。
海明校验
海明校验相比CRC校验更加的通俗易懂。海明校验校验位数r和待检验串的位数k满足和CRC校验相同的公式。但是这r个校验位的位置不同:这r个校验位分别分布在第2^(i-1) (i=1,2,...,r)上。
假设待校验数据有7位,那么对应海明校验码为4位,他们分布的位置如下:
1 2 3 4 5 6 7 8 9 10 11
第j位的数据被若干个海明位号之和为j的校验位所确定。那么,如何确定海明校验位的数值呢?
海明校验位的数值为对所有其所校验的待检验数据的偶校验确定。
另外设置指错字Gi,来判断哪一位校验位出现了问题。Gi为校验位和其所有校验的原数据位的异或,当Gi为1时,说明校验位出现问题。通过校验位可以指示到底是哪一位出错。
总而言之,海明校验的步骤如下:
- 求出r
- 偶校验求出各位校验位数值
- 校验时,求出对应指错字数值
- 根据指错字判断是否出错以及出错位置。
下面给出一个例子:
假设原来的数据为: 1011000
那么可以求出对应的海明校验位
p1 = b1^b2^b4^b5^b7 = 0
p2 = b1^b3^b4^b6^b7 = 1
p3 = b2^b3^b4 = 0
p4 = b5^b6Bb7 = 0
那么得到的编码为
01100110000
现在假设b3在传输中出错了,数据变为:
01100010000
那么指示它的校验位p2,p3都会出错,即对应的指错字
G2=1,G3=1
那么有
(G1G2G3G4)=0110 = 6
也就是第六位出错。即b3出错。
海明校验的缺点:
- 海明校验依然只能指出一位的出错。当多位出错时,海明校验无法精确指出。
- 配合使用奇偶校验,海明校验可以分辨一位和两位错误,但是无法分辨1位和3位错误。
总结:
本章学习了机器数分类和表达方式,以及确认数据传输过程中没有错误的三种校验方法。这些表示方式方法是后期机器数计算的基础。而校验则可以减少数据传输错误所带来的不良影响。