真值和机器数的互换
[原码,补码,反码,移码]
- 原码:符号位+绝对值的二进制。
- 补码:正数:补码等于原码;负数:除符号位外,各位取反末位加1
- 反码:正数:反码等于原码;负数:除符号位外,各位取反
- 移码:补码符号位取反
- 8421BCD码:每四位二进制表示一位十进制数,范围是[0,9]。
- 余三码:8421的基础上加3.
8421BCD码和余三码一般用于表示字符串,不用于计算
校验码
数据再计算机传输过程中会出现错误,错误会引起歧义,所以需要校验码。
码距是指两个码组对应位上数字的不同位数称为码组的距离,又称为汉明距离。码距为1时不具备校验能力。
通信双方的大工程某种共识:校验方法、校验位数、校验位置
1.奇偶校验码
以奇校验码为例:
最高位为校验位,最高位补0或1是校验码中1的个数为奇数。
数据:01010101
发送方:奇校验 1 01010101(1的个数右奇数个)
接收方:
没错:101010101----01010101(去掉校验位)
1位错:(1) 1 11010101
(2) 0 01010101(1的个数为偶数了,可以检验到错误)
2位错: 1 10010101(此时1的个数为奇数,不能检验到错误)
优点:简单,传输效率高
缺点:只能发现错误,不能修改错误;只有当奇数个位数出错时才能被发现。
2.Hamming校验码
发送方:
1、校验位的位数
(1)仅能发现并修正一位错
假设数据位D(d位),校验位R(r位)
2r>=d+r+1
(2)发现修正一位错,并发现两位错
2r-1>=d+r
2.校验位的位置
海明码的下标为2i的位置上,或者海明码最高位
设数据位d=8,推出r=4
H13 H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
R5 D8 D7 D6 D5 R4 D4 D3 D2 R3 D1 R2 R1
3.校验位的值
(1)确定校验关系:数据位在海明码中的下标=参与校验的校验位的下标和
D1(3=2+1) R2 R1
D2 (5=4+1) R3 R1
D3 (6=4+2) R3 R2
D4 :R3 R2 R1
D5: R4 R1
D6:R4 R2
D7 :R4 R2 R1
D8:R4 R3
2)确定校验位的值=它参与校验的数据位的抑或
R1=D1^D2^D4^D5^D7
R2:D1^D3^D4^D6^D7
R3:D2^D3^D4^D8
R4:D5^D6^D7^D8
R5:(D1^...^D8)^(R1^...^R5)
接收方:
S1=R1'^(D1'^D2’^D4’^D5‘^D7’)
S2=R2‘^(D1’^D3‘^D4’^D6‘^D7’)
S3=R3'^(D2‘^D3’^D4‘^D8’)
S4=R4'^(D5‘^D6’^D7‘^D8’)
S5=R5^(D1^...^D8)(R1^...^R5)
(1)没有错误 S5=0 S4S3S2S1=0000
(2)发生一位错
I.D2出错 S5 =1 S4S3S2S1=0101=5->H5,即出错位置在汉明码的下标
II. D5出错 S5 =1 S4S3S2S1=1001
III.校验位R1出错 S5 =1 S4S3S2S1=0001
(3) 发生两位错:
设数据位D1和D3出错:S5 =0 S4S3S2S1=0101
3.CRC 循环冗余校验码
模2运算
(1)模2加减运算—异或运算
eg:1010-1101=1010+1101=1010^1101
(2)模2除法运算:依托模2减法。根据被除数或者余数的最高位决定是否做模2减法,如果最高位1则做模2减法,否则不做减法
生成多项式
G
(
x
)
=
a
X
3
+
b
X
2
+
c
X
+
d
G(x)=aX^3+bX^2+cX+d
G(x)=aX3+bX2+cX+d
生成多项式是一串二进制编码,G。
假设数据位为D(位数为d),G位数为r+1位
发送方:
1.将D左移r位,低位补0,形成d+r位信息位M
2.M模2除G,得到商和r位余数
3.生成CRC编码=M+余数
接收方:
CRC编码模2除G=(M’+余数‘)/G
没有错误:余数为0,M’=M 余数’=余数
(M’+余数‘)/G=(M+余数)/G=M/G+余数/G=商+余数/G+余数/G=商+(余数+余数)/G=商
如果出错:根据余数情况修改或者判断错误
定点数的表示
定点数:小数点固定的数,纯小数或者纯整数
1.N位二进制数原码的表示范围:
整数:
[
−
2
n
−
1
+
1
,
2
n
−
1
−
1
]
[-2^{n-1}+1,2^{n-1}-1]
[−2n−1+1,2n−1−1]
小数:
[
−
(
1
−
2
1
−
n
)
,
1
−
2
1
−
n
]
[-(1-2^{1-n}),1-2^{1-n}]
[−(1−21−n),1−21−n]
2.N位二进制数补码的表示范围:
整数:
[
−
2
n
−
1
,
2
n
−
1
−
1
]
[-2^{n-1},2^{n-1}-1]
[−2n−1,2n−1−1]
小数:
[
−
1
,
1
−
2
1
−
n
]
[-1,1-2^{1-n}]
[−1,1−21−n]
定点数的运算—加减
1.原码加减—不适合做加减运算
(1)判断结果的符号
(2)相加或者用||被减数|-|减数||
(3)结果
2.补码加减
[A+B]补=[A]补+[B]补
[A-B]补=[A]补+[-B]补
优点:直接运算
定点数的运算—溢出的判断
双符号位法:两个符号位同时运算,双符号位不同则溢出,上溢和下溢。
1.逻辑移位:逻辑左移,逻辑右移
移出位移走,补位位补0
eg:1010
左移:0100
右移:0101
2.小循环移位:小循环左移,小循环右移
移出移入到补位位,同时移入到标记为C中
在数字最前和最后分别有一个C位,储存溢出位
eg:1010
左移:1 0101
右移:0101 0
3. 大循环移位:大循环左移,大循环右移
移出位移入到C位,C位移入到补位位
eg:0 1010
左移:1 0100
右移:0101 0
4.算术移位
(1)保留数值的数学意义,左移相当于乘以2,右移相当于除以2
(2)存在溢出或精度丧失
原码:符号位不动,数值位逻辑左右移
补码:带着符号位一起移动
移出位移走。补位位:高位补符号位,地位补零。
5.溢出过半
原码:符号位为0或1,数值位最高位为1
补码:符号位为0,数值最高位为1;符号位为1,数值最高位为0.
浮点数的表示
规则:
1)组成部分、顺序
2)每个组成部分位数
3)尾数和阶码表示形式:
尾数:定点小数
阶码:定点整数
一、IEEE754标准
1.格式:
32位(float)和64位(double)
2. IEEE有关阶码的规定
(1)用修正过的移码表示
修正过的移码可以表示0和±∞;
float:真值(e)=机器数的值(E)-128
double:真值(e)=机器数的值(E)-1024
(2)有关移码
e
=
E
−
2
n
−
1
e=E-2^{n-1}
e=E−2n−1
(3)E位全零或者全1的状态都不用
全0:表示数值0
全1:表示+-∞
所以正式的IEEE754标准:
e
=
E
−
(
2
n
−
1
−
1
)
e=E-(2^{n-1}-1)
e=E−(2n−1−1)
3. IEEE有关尾数的规定
(1)用修正过的原码表示尾数
(2)最高数值位必须为1,并且省略。
这样进一步提高了数据的精度。
(3)什么是规格化的尾数(M)
∣
M
∣
>
=
1
/
2
=
(
0.1
)
2
|M|>=1/2=(0.1)_2
∣M∣>=1/2=(0.1)2
因为尾数最高的数值位为1,并且省略。
E:阶码
S:符号位
M:尾数
float:
(
−
1
)
s
∗
1.
M
∗
2
E
−
127
(-1)^s*1.M*2^{E-127}
(−1)s∗1.M∗2E−127
double:
(
−
1
)
s
∗
1.
M
∗
2
E
−
1023
(-1)^s*1.M*2^{E-1023}
(−1)s∗1.M∗2E−1023
4. IEEE与真值的相互转换
eg:Float类型413C0000H的真值是多少:
413 C 0000 H = ( 01000001001111000000000000000000 ) 2 413C0000H =(0100 0001 0011 1100 0000 0000 0000 0000)_2 413C0000H=(01000001001111000000000000000000)2
S = 0 ; M = 0111 ; E = 10000010 S=0;M=0111;E=1000 0010 S=0;M=0111;E=10000010
e
=
(
−
1
)
s
∗
1.
M
∗
2
E
−
127
e=(-1)^s*1.M*2^{E-127}
e=(−1)s∗1.M∗2E−127
=
(
−
1
)
0
∗
1.01111
∗
2
130
−
127
=(-1)^0*1.01111*2^{130-127}
=(−1)0∗1.01111∗2130−127
=
(
1011.11
)
2
=(1011.11)_2
=(1011.11)2
=
11.75
=11.75
=11.75
5. Float类型的表示范围
二、非IEEE754标准
1.有机组成部分
每部分可以用不同的编码表示,最常见的阶码和尾数都用补码表示。
2. 表示范围
(1)为什么要规格化?
为了进一步提高数据精度
(2)规格化的本质是什么?
∣
尾
数
∣
>
=
0.5
|尾数|>=0.5
∣尾数∣>=0.5
(3)这种本质的体现是什么?
尾数分别用原码和补码表示的时候规格化的尾数是什么形式的?
原码:数值最高位为1
补码:1.0xxxxx或者0.1xxxxx或者1.1xxxxx
(4)IEEE754标准如何做的规划化?
尾数最高的数值位为1,并且省略。
设某浮点数阶码和尾数都用4位二进制补码表示。
浮点数的运算
一、IEEE754标准的加减运算
(1)0操作数检查
(2)对阶:小阶向大阶对齐,尾数右移
(3)尾数加减:补码双符号位
(4)规格化: 左规;右规
左规:尾数+-不发生溢出,结果不是规格化,左规尾数不定,阶码-1,知道规格化为止;
右规:尾数+-发生溢出,带两个符号位右移移位,阶码+1
(5)舍入,阶码采用补码双符号位运算。0舍1入。
(6)判断溢出
在溢出判断中,什么样的情况才算溢出?
阶码溢出才叫溢出
尾数溢出是否标志着结果的溢出?
尾数溢出不表示结果的溢出