非数值数据表示法
字符表示法
如何使用数值表示字符数据,有以下几个著名的标准:
ASCII:American Standard Code for Information Interchange (ANSI 7bits)EBCDIC-Extended Binary-Coded Decimal Interchange Code (IBM 8bits)Unicode
ASCLL
- 使用7bit表示128个字符,From 000 0000 to 111 1111
- ASCII中的数字字符和数字本身不相等
- 几乎所有计算机均支持该代码集
汉字表示法
16 位表示 , 又称为国标码或国际交换码一级常用汉字 3755 个,按汉语拼音排列二级常用汉字 3008 个,按偏旁部首排列非汉字字符 682 个一级汉字 16-55 区 二级汉字 56-87 区三级汉字 1-9 区 用户自定义 10-15 区
汉字机内码
国标码 = 区位码 + 2020H;
机内码 = 国标码 + 8080H;
字模码
Unicode
机器数(解决符号问题)
研究机器内的数据表示,目的在于组织数据,方便计算机硬件直接使用。
需要考虑:
支持的数据类型;
能表示的数据精度;
是否有利于软件的移植
能表示的数据范围;
存储和处理的代价;
...
- 真值:符号用“+”、“-”表示的数据表示方法。
- 机器数:将符号和数值一起编码表示的二进制数称为机器码,用0、1表示符号。
三种常见的机器数:(设定点数的形式为)
原码
增加符号位,0:正,1:负,数值位不变
- 表示简单
- 运算复杂:符号位不参加运算,要设置加法、减法器。
- 0的表示不唯一
- [X]原 + [Y]原 (不能直接判定是执行加法还是减法运算,分同号和异号)
[+0]原 = 0.000…0[-0]原 = 1.000…0[-0.1111]原 = 1.1111[ 0.1111]原 = 0.1111[ 1110]原 = 01110[-1110]原 = 11110
原码的表示范围:
定点小数:-0.11111...1~0.11111...1,亦等价于
定点整数:-011111...1~011111...1,,亦等价于
是对称区间
反码
所谓反码,就是二进制的各位数码取反。符号位表示方法与原码相同
[+0]反=0.000…0 [−0]反=1.111…1[0.1111]反=0.1111 [−0.1111]反=1.0000[1110]反=01110 [−1110]反=10001
- 表示相对原码复杂
- 运算相对原码简单:符号位参加运算,只需要设置加法器,但符号位的进位位需要加到最低位。
- 0的表示不唯一
反码的表示范围和原码一样。
补码
本质上是利用模的性质,达到将减法转化为加法的目的,就像时钟的指针往前走3格等效于往后走9格。
- 表示相对原码复杂
- 0的表示唯一
- 运算简单:只需设置加法器。
- 当X为负数时,补码等于反码末位加1
补码的简单编码方法:
补码的表示范围:
定点小数:,-1.000...0~0.111111...
定点整数:,-100...~ 011...
非对称区间,左侧多一个数
补码的扩展:
由 [X]补 求 [X / 2]补:
原符号位不变,符号位与数值位均右移一位:
[X]补 =10010 则 [X/2]补 =11001 符号向右扩展
[2x]补=? ➡ 左移,末位补零,符号变化溢出
不同位数的整数补码相加减时:位数少的补码符号位向左扩展一直扩展到符号位对齐
补码的计算方法归纳:
要计算一个数据的补码时,一定会指明数据的长度 n。
- 不看数据前面的正负号,将数据转换成二进制;补足 n 位。若超出 n 位则截断,保留低 n 位。
- 若数据前面无符号,即缺省为 + 号,该数的补码就是 1 的结果;
- 若数据前面有负号,则对 1 的结果逐位求反再加 1,保留后n位。
此外还可以或者减 1 后求反。
通过补码与负数的和为2^n来检验正确性
移码(增码)
[x]移
保持数据原有大小顺序,便于进行比较操作。
与补码的符号位相异,数据位相同
定点与浮点数据表示
定点数据表示(小数点位置固定的数)
- 可表示定点小数和整数,仅能表示纯小数及纯整数
- 表现形式:
- 定点小数表示数的范围(补码为例):
- 定点整数表示数的范围(补码为例):
- 定点数据表示数的不足:数据表示范围受限
浮点数据表示(解决小数点问题)
把数的范围和精度分别表示的一种数据表示方法。
使用场合:当数的表示范围超出了定点数能表示的范围时。
一般格式
E: 阶码位数,决定数据的范围
M: 尾数位数,决定数的精度,尾数最高有效位为1的数称为规格化数。
例如,将x =表示成机器形式。假定用8位表示该数,且阶码占3位,位数占5位(均包含一位符号位)。
答案是1 1 1 1 0 0 1 0
一般表示格式的不足:不同系统可能根据自己的浮点数格式从中提取不同位数的阶码
IEEE 754格式
IEEE 754是一种定义了浮点数表示和运算标准的国际标准。该标准规定了浮点数的二进制表示、舍入规则、溢出处理等方面的细节,以确保在不同计算机系统之间实现浮点数的一致性。
IEEE 754浮点数的表示形式分为单精度(32位)和双精度(64位)两种。
IEEE 754浮点数的基本结构包括三个部分:符号位、指数部分和尾数部分
S | 8位偏指数E | 23位有效尾数M | 单精度 |
S | 11位偏指数E | 52位有效尾数M | 双精度 |
IEEE754尾数形式为1.XXXXXX,其中M部分保存的是XXXXXX(1被隐藏),从而可保留更多的有效位,提高数据表示的精确度。
与上述IEEE754格式相对应的32位浮点数的真值可表示为:
IEEE 754浮点数标准还规定了特殊值,如正无穷、负无穷、NaN(Not a Number)等,以及舍入规则、精度要求等细节:
E=0 , M =0 :表示机器零;
E=0 , M ≠0 :非规格化的浮点数,为的是进一步提高浮点数精度。
非规格化浮点数公式:
1≤ E ≤ 254 :规格化的浮点数;
E=255 , M=0 :无穷大的数,对应于x / 0 (其中x≠0) ;
E=255 , M≠0 :N=NaN,表示一个非数值,对应于0 / 0。
IEEE754 32位浮点数与对应真值之间的变换流程:
例如,要将十进制数20.59375转换成32位IEEE754格式浮点数的二进制格式。
解:
先将十进制数换成二进制数: 20.59375=10100.10011
移动小数点,使其变成1.M的形式 10100.10011=1.010010011×2 4
得到: S=0, e = 4,E= 100+01111111 =10000011,M = 010010011
最后得到32位浮点数的二进制存储格式为:
0100 0001 1010 0100 1100 0000 0000 0000 = 41A4C000H
数据校验的基本原理
必要性
受元器件的质量、电路故障或噪音干扰等因素的影响,数据在被处理、传输、存储的过程中可能出现错误;
若能设计硬件层面的错误检测机制,可以减少基于软件检错的代价。
校验的基本原理
增加冗余码(校验位)
码距
同一编码中,任意两个合法编码之间不同二进数位数的最小值;
0011与0001 的码距为1,一位错误时无法识别;
0000、0011、0101、0110、1001、1010、1100、1111等编码码距为2。任何一位发生改变,如0000变成1000就从有效编码变成了无效编码,容易检测到这种错误。
校验码中增加冗余项的目的就是为了增大码距。
码距与检错、纠错能力的关系
- 码距≥e+1:可检测e个错误
- 码距≥2t+1:可纠正t个错误
- 码距≥e+t+1:可纠正t个错误,同时检测e个错误(e ≥ t)
码距越大,抗干扰能力越强,纠错能力越强,数据冗余越大, 编码效率低,编码电路也相对复杂;
奇偶校验
奇偶校验的基本原理
1. 增加冗余码(校验位)
2. 有效信息(k位) 校验信息(r=1位)
3. 编码:根据有效信息计算校验信息位,使校验码(数据+ 1位校验信息)中1的个数满足奇/偶校验的要求: (连续异或,偶数个1时结果为0)
0001 ➡ 00011 (偶校验) (校验码偶数个1)
0001 ➡ 00010 (奇校验) (校验码奇数个1)
4. 检错:
偶校验检错码: ,G=0表示数据正常,否则表示出错。
奇校验检错码: ,G=0表示数据正常,否则表示出错。
特点
- 编码与检错简单
- 编码效率高
- 不能检测偶数位错误, 无错结论不可靠,是一种错误检测码
- 不能定位错误,因此不具备纠错能力
- 奇/偶校验码距为 2,如11000011 ➡ 01000010
- 一般在同步传输方式中常采用奇校验,异步传输方式中常采用偶校验
改进的奇/偶校验
- 双向奇偶校验
- 方块校验
- 垂直水平校验
CRC校验
CRC(Cyclic Redundancy Check)校验是一种在数据通信中常用的差错检测技术。它通过对数据进行多项式运算,生成一定长度的冗余校验码,将该校验码附加到原始数据中发送。接收方在收到数据后,进行相同的多项式运算,然后将计算出的校验码与接收到的校验码进行比较,从而检测数据是否在传输过程中发生了错误。
收发双方约定的一个(r + 1)位二进制数,发送方利用G(X)对信息多项式做模2除运算,生成校验 码。接收方利用G(X)对收到的编码多项式做模2除运算检测差错及错误定位。
G(x)应满足的条件:
- 最高位和最低位必须为1;
- 被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0;
- 不同位发生错误时,模2除运算后余数不同;
- 对不为0余数继续进行模2除运算应使余数循环。
CRC校验的主要特点包括:
多项式生成器: CRC校验使用一个预定义的生成多项式,通常用二进制表示。该多项式决定了CRC校验码的生成规则。
除法运算: 数据发送方和接收方都执行CRC多项式除法运算。发送方用生成多项式除以数据,并将余数(CRC校验码)附加到数据末尾。接收方执行相同的除法运算,如果余数为零,说明数据没有错误;否则,说明数据可能存在错误。
固定长度的校验码: CRC校验生成的校验码长度是固定的,通常在16位、32位等。这种特性有助于在接收端检测到传输过程中可能发生的错误。
CRC不能纠正错误,但它可以有效地检测出大多数传输错误。
模2运算规则
a) 加/减运算:异或运算,加不进位,减不借位
0±0=0,0±1=1,1±0=1,1±1=0
b) 模2除法:按模2减,求部分余数,不借位。
c)上商原则:
①部分余数首位为1时,商为1,减除数;
②部分余数首位为0时,商为0,减0;
③当部分余数的位数小于除数的位数时,该余数即为最后余数。
编码步骤
(1)根据待校验信息的长度k,按照 k+r ≤ 2r-1 确定校验位r的位数
如对4位信息 1100 进行CRC编码,根据
得
(2)根据r 和生成多项式的选择原则,选择位数为 r +1 的生成多项式G(X)= 1011
(3)进行下列变化:将待校验的二进制信息Q(X)逻辑左移 r 位,得到Q(X)’
有效信息(k位) 校验信息(r位) ➡ 1100 000
(4)对Q(X)’按模2运算法则除G(x),求CRC编码中的r位校验信息
(5)用得到的余数替换Q(X)’的最后r位即可得到对应的CRC编码:
1100 000➡1100 010
CRC的检错与纠错
接收方利用G(X)对收到的编码多项式做模2除运算,余数为0说明传输没有错误;余数不为0说明传输有错。
例如(7,4)编码不同数位出错对应的余数:
若余数不为0,一边对余数补0继续做模2除,同时让被检测的校验码循环左移,当余数为101时, 出错位也移到A1位置。通过异运算纠正后继续循环左移和执行余数模2除法,直到修改后的出 错位回原位。
海明校验
海明检验基于海明码(Hamming Code),一种特殊的错误检测和纠正码,通过添加额外的校验位来实现。
海明码中的每个数据块包含了原始数据位(数据)和额外的校验位(校验码)。这些校验位的位置由数据位的位置决定,以一种特定的规则进行排列。通过这种方式,当数据传输时,接收方可以使用这些校验位来检测并纠正传输过程中可能发生的错误。
海明检验的基本原理:
生成海明码: 在发送数据之前,计算数据的海明码。海明码中的每个校验位都是根据特定规则与数据位相关联的。
传输数据: 将原始数据和生成的海明码一起传输。
接收数据: 接收方收到数据后,使用相同的海明码规则计算接收到的数据的海明码。
校验: 接收方比较接收到的校验位与计算出的校验位。如果它们不匹配,则表示数据在传输过程中发生了错误。
如果海明检验检测到错误,接收方可以尝试使用海明码中的校验位来确定错误的位置,并尝试纠正错误。这种方式可以有效地提高数据传输的可靠性,特别是在受到噪声干扰或传输信道不稳定的情况下。
具体步骤
增加冗余码(校验位)
- 有效信息(k位) 校验信息(r位)
- 设k+r位海明码从左到右依次为第1,2,3,…..., k+r位
- r位校验位记为(i=1,2,…,r),分别位于k+r位海明编码的第(i=1,2,…,r) 位上,其余位依次放置被校验的数据位;
(7,4)海明校验码中校验位和被校验信息位的排列如下:
海明码位号 Hj 1 2 3 4 5 6 7 8 9 10 11 P和b的分布 P1 P2 b1 P3 b2 b3 b4 P4 b5 b6 b7
- Hj位的数据被编号小于j的若干个海明位号之和等于j的校验位所校验 ,如
由此可采用偶校验计算出P1~P4 四个校验位的值
- 设置指错字G4G3G2G1
为0则表明无错误,反之指出出错位的海明码位号。
如 = 1 0 1 1(转化为10进制为11), 表明位出错! 当只有一位出错时,由于指错字能定位错误,故可利用指错字配合适当电路和异或门,修正出错位。