数据的表示和运算【考研/408】
十进制转换为二进制
整数:如123转换为二进制,将123无限除2,将余数写在右边,当处到最后为0的时候,把右边的余数自下往上写,也就是下面的是最高位,上面的是最低位,具体如书P27
小数:将小数部分乘2,如果结果>1,则记1,并把多出来的小数接着乘,可以无限乘,看最后要取几位,自上往下记,也就是最上面的是最高位
带正负号的叫 真值,不带正负号的叫机器数,机器数中0代表+,1代表-
8421码(是一种十进制编码),由于8421可以代表16种代码,因此其表示10进制时,有6中的可能是冗余的,因此在两数运算相加的和大于等于二进制1010时要加6修正,因为1010~1111是无效码
码距,合法码字间最少变化的二进制位数,如1100和1101之间码距为1,1001和0010之间码距为3
奇偶校验码,在最前面加奇偶校验位
奇校验码:校验码+信息位中一共有奇数个“1”
偶校验码:校验码+信息位中一共有奇数个“0”
可以检测出奇数位错误,但不能检查出偶数位,也不能纠错
海明码
可以发现2位错误并纠正1位错
如求1010海明码
1.算出校验位数k
∴ k=3
2.确定校验位在海明码中的位置
则空出k个2^x的位置 如这里要空出三个 分别是2^0\2^1\2^2 , H1 H2 H4
H7 |
H6 |
H5 |
H4 |
H3 |
H2 |
H1 |
1 |
0 |
1 |
|
0 |
|
|
求校验位。实际上这里进行的是:
要求P1则 要求**1通配符下,即001、011、101、111即H1,H3,H5,H7的偶校验的校验码
P2则 就是要求 *1*通配符下所有的位数的偶校验
P3则 就是要求 1**通配符下所有的位数的偶校验
若使用简便方法则如下:
P1(H1) P2(H2) P3(H4)
因为D1在H3上,所以 3= 1 1
D2在H5上,所以 5= 1 1
D3在H6上,所以 6= 1 1
D4在H7上,所以 7= 1 1 1
所以P1=D1⊕D2⊕D4=0
P2=D1⊕D3⊕D4=1
P3=D2⊕D3⊕D4=0
校验:则是把S1=P1⊕D1⊕D2⊕D4
S2=P2⊕D1⊕D3⊕D4
S3=P3⊕D2⊕D3⊕D4
若S1 S2 S3为“000”则说明没出错,如果不是000,则结果的数字就是出错的位数
如001则说明H1出错
循环冗余校验(CRC)码
可以发现并就整一位或多位错(与多项式有关),用于数据链路层,大量数据时
R=生成多项式的最高幂次 K=信息码长度 N=校验码位数=K+R
如生成多项式G(x)=????3+????2+1 ,信息码为101001
对应的二进制码为1101,1????3+1????2+0????1+1 ,所以如果给出二进制码可以反推最高幂次
则R=3 K=6 R=9
将信息码左移R位 → 101001000
然后做如下,最后的余数作为校验位
检错和纠错时,将收到的CRC码用生成多项式的二进制做模2除法,若余数为0,则无错
若得到余数010则C2出错,取反即可
定点数的表示与运算
全是计算的选择题,例如:加减运算后的结果,类型转换后的结果
补码:正数不变,负数符号位不变,数值取反+1,适用于知原求补,知补求原
反码:正数不变,负数符号位不变,数值取反,适用于知原求反,知反求原
一个真值的移码和补码仅差一个符号位
移码保持数据原有的大小顺序
算数位移:符号位不参与移动
逻辑位移:符号位也参与移动
不管左移还是右移都填0
循环位移:
补码定点数加减运算
(mod M):丢掉溢出位
补码运算结果任为补码
溢出判断:
1)一位符号位
V=????????????????????????+????????????????????????
若V=0,无溢出;若V=1,溢出
2)两位符号位
3)一位符号位其他方法
若符号位进位与最高位进位相同则无溢出,不同则溢出
大端方式存储:将高字节的数据存储在低地址,低字节数据存储在高地址
小端方式存储:将高字节的数据存储在高地址,低字节数据存储在低地址
C语言以补码形式存放数据
8421是十进制编码
模4补码有模2补码的全部优点且更易检查加减的溢出问题,只需1个符号位
运算中正数的*2就是把二进制左移1位,/2就是把二进制右移1位
浮点数的表示和运算
规格化:
补码的规格化:
正数的最高数值位必为1
负数的最高数值位必为0
补码扩充:
补码扩充时,只要补足符号位就行,也就是当正数时,补0,负数时补1
IEEE754标准下:
移码可以直接看做无符号数进行运算 如上述例子的double型中
移码为000 0001 1100,看做无符号十进制数为128,则阶码真值=移码-偏移量=28-1023
阶码对应移码机器数不能全0/全1,全0/全1保留 有他用 ↓
重点掌握普通情况
科学计数法举例 ↓