机器数:各种数据在计算机中的表现形式称为机器数,机器数的特点是数的符号用0和1表示,机器数对应的实际数值称为该数的真值
机器数分为两种
1)无符号:无符号的表示正数,在机器中没有符号位
2)带符号:机器数的最高位表示正负的符号位
# 原码,反码,补码,移码
1)原码:在原码的表示中,机器数的最高位是符号位,用0表示正号,用1表示负号,余下的各位为数的绝对值
[+0]原 = 00000000 [-0]原 = 10000000
2)反码:在反码的表示中,机器数的最高位是符号位,用0表示正号,用1表示负号。当符号位为0时(正数),其余的几位为该数的二进制数;当符号位为1时(负数),要将剩下的几位按位取反(符号位不变)
[+0]反 = 00000000 [-0]反 = 11111111
3)补码:在补码的表示中,机器数的最高位是符号位,用0表示正号,用1表示负号,当符号位为0时(正数),其余的几位为该数的二进制数;当符号位为1时(负数),要将剩下的几位按位取反(符号位不变)且最低位加1
[+0]补 = 00000000 [-0]补 = 00000000
4)移码:将补码的符号位按位取反
[+0]补 = 00000000 4[+0]移 = 10000000
# 定点数和浮点数
1)定点数:小数点固定不变的数,即约定机器中所有数据的小数点位置是不变的。
固定的小数点的位置决定了固定为数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数
定点整数:纯整数,小数点在最低有效位之后 111.
定点小数:存小数,小数点在最高有效位之前 .111
定点数所能表示的范围较小,在运算的过程中容易溢出,所以就有了下面的浮点数表现形式
2)浮点数:小数点位置不固定的数,能够表示的范围更加的大
这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如100.11利用科学计数法可以表示位1.0011*102,其中1.0011为尾数,10为基数,2为指数。
阶符 | 阶码 | 数符 | 尾数 |
注:很明显,一个浮点数的表示不是唯一的,当浮点数小数点的位置发生改变时,阶码也会随着改变,因此可以利用多个浮点的形式表示同一个数。一个十进制可以写成多种形式,一个二进制也能写成多种形式。例如1011.1100可以写成 0.10111100*104,也可以写成 10.111100*102
浮点数通常表示成N = M*R^E
注:浮点数所能表示的数值范围由解码决定,精度由尾数决定
3)IEEE754
IEEE754是由IEEE(电气和电子工程师协会)制定的有关浮点数的工业标准,是20世纪80年代以来最为广泛使用的浮点数运算标准,为许多的CPU所使用
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。
## 校验码
什么是校验码:在计算机运行时,各个部件之间要进行数据的交换,有两种方法可以确保数据在传送过程中的正确无误,一是提高硬件电路的可靠性,二是提高代码的校验能力,校验能力包括查错和纠错。通常利用校验码来检测传送的数据是否出现错误
校验码的基本思想:将数据可能出现的编码分为两大类:合法编码和错误编码,合法编码用于传送数据,错误编码是不允许在数据中出现的编码
码距:一个编码系统中任意两个合法编码之间至少有多少个二进制位不同
码距:两个码字A和B之间不同的比特数,如1010和0011的码距为2;1111和0000的码距为4
要想纠错和检错,必须满足两个条件:
1:在一个码组内为了检测e个误码,要求最小的码距d应满足:d>=e+1
2:在一个码组内为了纠正t个误码,要求最小的码距应满足d>2t+1
3:用时纠错和检错:d>=e+t+1
例子一:不具备纠错能力也不具备检错能力
若用一位的二进制编码,A=1,B=0,则 A B之间最小的码距为1
合法码:(0,1) 非法码(0,1)
上方无检错纠错能力,例如当传送的正确编码为1时,在传送过程中出错变为0,而0也是合法编码,故不能判断是否出错
例而二:具备检错能力,但不具备纠错能力
若用两位的二进制编码,A=11,B=00
合法码:(11,00) 非法码:(01,10)
上方具备检错,但无法纠错,因为无论A(11)或者B(00),如果一位编码发生错误,都将变成01或者10,01和10都为非法码组,接收端能判断出错,但不能判断是A(11)还是B(00)造成的错误
例子三,具有检错能力也具有纠错能力
若用三位的二进制编码,A=111,B=000,则AB间最小的码距为3
合法码(111,000) 非法码(001,010,011,100,101,110)
当只有一位出错时:上方具有检错和纠错能力,例如当信息为A(111)时产生一位的错误,错误码将有三种表现形式(110,101,011),这些都是非法码组,可以确定其为误码,这三个非法码组离111非常近,而又离000非常远,可以确定其为A(111)的误码,只要将其中的0改为1即可纠正
当有两位出错时:例如A(111)变成了 100 ,接收端无法确定是A(111)还是B(000)产生的错误,接收端只能检验错误,无法纠正错误
当有三位出错时:信息将从一个合法编码A(111)或则B(000),变成合法编码B(000)或则A(111),故无法纠错也无法检错
1:奇偶检验码
通过在编码中增加一位校验码来使编码中的1的个数变为奇数(奇校验),或则偶数(偶校验),从而使码距变为2,对于奇校验,它可以检测代码中奇数位出错的编码,但不能发现偶数位出错的情况;当合法编码中的奇数位发生了错误时,即编码中的1变成0,或者0变成1时,则编码中1的个数的奇偶性就发生了变化,从而可以发现错误
原编码 | 奇校验 | 偶校验 |
0000 | 0000 1 | 0000 0 |
0001 | 0001 0 | 0001 1 |
0010 | 0010 0 | 0010 1 |
0011 | 0011 1 | 0011 0 |
常用的奇偶校验码:水平奇偶校验码,垂直奇偶校验码,水平垂直检验码
水平奇偶校验码
原码 | 水平奇校验码 |
0000 0001 | 0000 0001 0 |
0000 0010 | 0000 0010 0 |
0000 0011 | 0000 0011 1 |
0000 0100 | 0000 0011 0 |
垂直奇偶校验码:将数据分成若干组,每组排成一行,再加一行校验码
原编码 | 垂直奇校验 | 垂直偶校验 |
1101 1001 | 1101 1001 | 1101 1001 |
0101 0010 | 0101 0010 | 0101 0010 |
0011 0011 | 0011 0011 | 0011 0011 |
1100 0100 | 1100 0100 | 1100 0100 |
. | 1000 0011(该行为校验位) | 0010 1100(该行为校验位) |
水平垂直奇偶校验码:同时利用水平校验和垂直校验
原编码 | 奇校验 | 偶校验 |
1101 1001 | 1101 1001 0 | 1101 1001 0 |
0101 0010 | 0101 0010 0 | 0101 0010 0 |
0011 0011 | 0011 0011 1 | 0011 0011 1 |
1100 0100 | 1100 0100 0 | 1100 0100 0 |
1000 0011 0(该行为校验位) | 0010 1100 1(该行为校验位) |
2:海明码
Hamming Code是一种利用奇偶性来纠错检测的校验方法。海明码的构成方法是在数据位之间的特定位置上插入k个校验位,通过扩大码距来实现检错和纠错
设数据位为n位,校验位为k位,则n和k必须满足关系 2k-1>=n+k
设k个校验位为Pk,Pk-1....P1,n个数据位为Dn-1,Dn-2....D1,D0,对应的海明码为Hn_k,Hn+k-1....H1
Pi在海明码的第2^i+1位置,即Hi=Pi,且j=2^i-1
如果有8位的数据位,进行海明码的校验需要4个校验位(2^4-1=15>8+7)
得到的海明码为:
H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
D7 D6 D5 D4 P4 D3 D2 D1 P3 D0 P2 P1
待完成....