408计组 |二、数据的表示和运算
[一 数制和编码](#一 数制和编码)
[二 定点数](#二 定点数)
一 数制和编码
- 奇偶校验
- 海明码
- 循环冗余校验码
1.数制相互转换
1.1 r进制到十进制
1.2 二进制到八进制、十六进制
1.3 十进制到r进制
2.BCD码
3.字符与字符串
3.1 字母存储
3.2 汉字存储
4.校验码
4.1 奇偶校验
4.2 海明码
4.2.1 求解步骤
(1)确定校验码位数
- \(2^k\ge n+k+1(n+k种出错,1种正确)\)
- n个信息位;k个校验位,校验码有\(2^k\)种状态;
(2)确定校验码位置
-
\(P_i\)放在\(2^{i-1}\)的位置上,其余按顺序
-
信息位\(D_4D_3D_2D_1(1010)\),校验位\(P_3P_2P_1\),海明码为\(H_7H_6H_5H_4H_3H_2H_1\)
(3)求校验位的值
-
由\(H_i\)位置\(i\)算出对应的二进制码
-
从右到左按列\(h\)观察,选出所有为1的\(H_i\)。找出\(H_i\)对应的信息位\(D_j\),对所有\(D_j\)进行异或运算,则可得出对应的\(P_h\)
(4)纠错
-
对校验方程进行计算
-
若出现偶校验错误,将结果\(S_3S_2S_1\)转为十进制,对应位置即为错误位置
4.2.2 检错与纠错
-
检错能力:2;纠错能力:1
-
全体校验
当两个跳变时,无法根据对应的位置确定它就是出错位。即上面无法区别是1位错还是2位错。所以引入全校验位,在最后面加上\(P_全\),该值是由原始数据得出偶校验码。
现在对传输的数据进行一次全体偶校验进行分析
4.3 循环冗余校验码
CRC。数据发送、接受方约定一个“除数”,保证余数为0
4.3.1 求CRC码
(1)确定长度与二进制码
- 信息码长度K;
- 校验码R=生成多项式最高次幂或(二进制码位数-1);
- 校验码位数N=K+R
- 二进制码:生成多项式的系数
(2)由模2除法求CRC码
- 信息码低位补R个0(右侧)
- 模2除法
-
被除数:信息位+R个0
-
除数:二进制码
-
除的时候看被除数的最高位作为商,减的时候用异或运算。
-
余数比被除数少一位,余数结果为校验位
-
- CRC码:信息位+校验位
4.3.2 检错与纠错
-
示例
-
检错:
可检测出所有奇数个错误;
可检测出所有双比特的错误;
可检测出所有小于等于校验位长度的连续错误;
-
纠错:
K个信息位,R个校验位,若生成多项式选择得当,且 \(2^R\ge K+R+1\),CRC码可纠正1位错。
二 定点数
- 补码作用
- [移位运算](#2.2 移位运算)
- [加减运算](#2.3 加减运算)
- [乘法运算](#2.3 乘法运算)
- [除法运算](#2.4 除法运算)
1.定点数的表示
表示范围
类型 | 范围 |
---|---|
无符号数(n) | \(0\sim2^n-1\) |
原码/反码整数(n+1) | \(-(2^n-1)\le x\le 2^n-1\) |
原码/反码小数(n+1) | \(-(1-2^{-n})\le x\le 1-2^{-n}\) |
补码/移码整数(n+1) | \(-2^n\le x\le2^n-1\\比原码多表示一个-2^n\) |
补码小数(n+1) | \(-1\le x\le1-2^-n\\比原码多一个-1\) |
2.定点数运算
2.1 补码作用
减法换加法,减少硬件成本(ALU无需集成减法器)
\(x=qm+r\\x~mod~12=r\\q为整数,r为余数,m为模。即要在r相等的情况下找到x\)
- 模余数相同的数是同一类,等价。即可知-3和9在模12的条件下是等价的。
- 互为补数:两个数的绝对值=模。减去一个数即加上这个数的补数。也就是\(10+(-3)\)可转换成\(10+9\)再取模。
- 而计算机是以\(2^8(1,00000000)\)为模的,a的补数=模-|a|=全部取反再+1
2.2 移位运算
2.2.1 算数移位
补码的算数移位
-
正数和原码一致
-
由于负数补码=反码末位+1。所以反码最右边连续的1会因进位变成0,直到第一个0。故负数补码最右边的1及其右边与原码一致。而其左边与反码一致。所以造成了:
- 右移(同反码):高位补1,低位舍弃。
- 左移(同原码):低位补0,高位舍弃。
加法举例
2.2.2 逻辑移位
RGB值例子:例如用3B储存102、139、133
102的二进制数储存进去并向左移动16位
139的二进制数储存进去并向左移动8位
133的二进制数储存进去
相加得3B的RGB值
2.2.3 循环移位
2.3 加减运算
2.3.1 溢出判断
-
方法一:一位符号位
\[V=AB\overline{S}+\overline{AB}S\\加数的符号位为:A、B;结果的符号位S:\\乘法表示与,加法表示或 \] -
方法二:一位符号位,根据进位情况判断
\[V=C_1\oplus C_s\\ 结果的最高数值位的进位:C_1;\\符号位的进位:C_s; \] -
方法三:双符号位
\[V=S_{s1}\oplus S_{s2}\\正数符号位:00;负数符号位11;\\结果的两个符号位分别是S_{s1}S_{s2} \]==>V=0无溢出;V=1溢出
2.3 乘法运算
图示
- 原码一位乘法
- 补码一位乘法中MQ新增了红色部分(辅助位),为保持一致ACC、X也加了一位,变成双符号位。
运算过程
-
原码一位乘法
-
补码一位乘法
2.4 除法运算
2.4.1 思想
确定商:若被除数大于除数,确定1,否则0;补零继续算
2.4.2 恢复余数法(原码)
ACC | 被除数、余数 |
---|---|
MQ | 商 |
X | 除数 |
-
由于计算机不会比较被除数与除数的大小,所以会默认上商1。它根据(被除数-除数/余数-除数/ACC-X)的结果的符号位判断商1或是商0,若结果是负数,则说明被除数小于除数,即商1是错的,此时需要变成商0,且回复余数。
-
\(被除数-除数=(ACC)-[|y|]=(ACC)+[-|y|]_补\)。更具体的转换过程:
-
先将原码\(y\)变成\([y]_补\)
若y为正,\([y]_补\)与原码一致
若y为负,\([y]_补\)为原码的符号位不变,后面取反
-
再将\([y]_补\)变为\([-y]_补\)
\([y]_补\)全部取反再,末位+1
-
-
若上面结果是负数-->恢复余数:\((ACC)+除数=(ACC)+[|y|]_补\),商变回0,再计算
-
每次计算完逻辑左移,低位补0。机器字长有几位就求几位的商
-
余数=结果*\(2^n\)(n=机器字长-符号位,左移n次 上商n+1次)
-
示例:
设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,采用原码恢复余数法求x/y。\(|x|=0.1011,|y|=0.1101,[|y|]_补=0.1101,[|-y|]_补=1.0011\)
2.4.2 加减交替法(原码)
也称不恢复余数。原理:若余数为负,直接商0。余数不恢复,而是:
\(新余数=余数左移1位+|除数|~(左移1位即乘以2)\)
过程
2.4.3 加减交替法(补码)
3.强制类型转换
C语言中以补码的形式存储
有符号数与无符号数:不改变数据内容,只改变解释方式(符号位被当做数值位)
void main(){
//有符号数:short,占2字节;
//无符号数:unsigned
short x=-4321;//[x]原=1001000011100001;[x]补=1110111100011111
unsigned short y=(unsigned short)x//y=1110111100011111,真值61215
}
长整数变短整数:高位截短,保留低位
void main(){
//int:占4字节
int a=-165537,b=-34991;//a:0x000286a1 b:0xffff7751
short c=(short)a,d=(short)b//c:0x68a1(-31071) d:0X7751(30545)
}
短整数变长整数:符号扩展
void main(){
//负数补1,正数补0
short x=-4321;
int m=x;//前面补1
unsigned short n=(unsigned short)x;//变成了无符号数
unsigned int p=n;//前面补0
}