导图社区 数据的表示和运算
数据结构第二章数据的表示和运算知识总结,包括数制与编码、定点数的表示和运算、算术逻辑单元ALU、浮点数的表示和运算等。
编辑于2022-03-16 15:21:52chp2:数据的表示和运算
2.1数制与编码
进位计数值
二进制D
八进制Q
十进制B
十六进制H
进制转换
二<--->八、十六
SUM(每位位权乘各自的位数)
二、八、十六(n)<-->十
整数部分
除n取余,自下而上
小数部分
乘n取整,自上而下
二<--->八、十六
每3(4)位划分,高位不足补0
八<--->十六
以二进制为中介
机器数
数字化的真值,用0表示+,1表示-
BCD码:二进制编码的十进制数
8421
用四位二进制表示一位十进制数
权重由高到低为8、4、2、1
8421码遇到1001=9进位
余3
无权BCD码
在8421的基础上加上十进制数3
即加上0011
2421
用四位二进制表示一位十进制数
权重由高到低为2、4、2、1
若>=5,则最高位一定是1
若<5,则最高位一定是0
1011是合法编码
0101是非法编码
ASCII
0---0
65---A
97---a
汉字编码
两个字节表示一个汉字
校验码
奇偶校验
奇校验
添加一位校验码后,1的个数为奇数
偶校验
添加一位校验码后,1的个数为偶数
循环冗余校验CRC
天勤P30
海明码
在信息中插入若干数据,用于监督数据中哪一位数据出现错误
多重奇偶校验
假设信息位数为k,校验字段r位
r的确定
校验字段共能表示2^r种情况,其中一种用于表示无错误
若要用于定位一位数据差错
则:2^r >=k+r+1
确定校验码的位置
海明码中校验码并不是单纯插入到数据首或尾
第i位校验码在k+r位数据中的位置应为2^{i-1}
下标从1开始
确定数据的位置
直接填充校验码之外的位置
计算校验码的值
被校验数据码的海明位号(M_x)等于校验该位数据码的各个校验位号(P_y)之和
2.2定点数的表示和运算
定点数的表示
无符号数
没有符号位,所有位数都用于表示数值大小
八位无符号数表示范围
0~255
有符号数
原码
正数
符号位为0,数值部分与真值相等
负数
符号为为1,数值部分与真值相等
性质
原码中有两个0,分别是
00000000
10000000
8位原码的表示范围
-127~127
n位原码的表示范围
-(2^{n-1}-1)~(2^{n-1}-1)
补码
正数
符号位为0,数值部分与真值相等
负数
符号位为1,数值部分为原码的数值部分取反加1
性质
只有一个0
故补码比原码和反码能够多表示一个数据
对于定点小数,补码可以多表示一个-1
8位补码的表示范围
-128~127
n位补码的表示范围
-2^{n-1}~(2^{n-1}-1)
反码
正数
符号位为0,数值部分与真值相等
负数
符号位为1,数值部分为原码的数值部分每位取反
性质
有两种0
8为反码表示范围
127~127
n位原码的表示范围
-(2^{n-1}-1)~(2^{n-1}-1)
移码
由于补码不能直接表示数字间的大小关系
在真值上加2^n
表示范围
补码的区间左右各加2^n
0~2^{n+1}-1
移码就是补码的符号位取反
移码的0也是唯一的
定点数的运算
使用哪种编码进行运算
原码
最高位容易因为舍去导致结果不准确
补码(一般使用)
x+(-x)=0
0的补码只有一种
符号位可以参与运算
可以把减法转化为加法
补码容易扩充
正数补0
负数补1
补码可以多表示一个数
反码
0有两种
进位不能直接舍去
定点数的移位运算
逻辑移位
左移
高位丢失,低位补0
右移
低位丢失,高位不0
算术移位
正数
左移右移都补0
负数
原码
符号为不变,空位补0
补码
左移
低位出现空位
补0
前提
原最高有效位与原符号位相同
右移
高位出现空位
补1
反码
符号位不变,空位补1
双符号位只有低位需要参与移位操作
原码定点数加减运算
加法
判断符号位
相同
绝对值相加
不相同
绝对值做减法,大减小
减法
减数符号位取反
被减数与符号取反后的减数按照源码加法计算
补码定点数加减运算
加法
符号位参与运算
两数和的补码等于两补码的和
减法
被减数与减数的相反数做加法
如何求补码的相反数
全部取反(包括符号位)
然后加1
溢出的判断
溢出产生的原因
运算结果超出表示范围
运算结果进位后占用了符号位
分类
上溢
下溢
检测判断溢出
method1
不论做加法还是做减法,实际参与运算的两个数(即加法器计算的两个数)符号相同,而结果符号bu't不同,则认为溢出
method2
数值部分最高位的进位 和 符号位产生的进位 进行异或运算
相同为0,不同为1
结果为1
溢出
结果为0
不溢出
method3
用两位符号位判断溢出(变形补码)
符号位的两位不同时表示溢出
高位符号位一定代表真正的符号位
正常的数符号位要么是11要么是00
所以机器中只需要存储一位符号位,仅仅在相加时多加一个符号位
定点数乘法
原码一位乘 天勤P45
通过加法和移位操作实现
计算x*y时,y仅仅起到判断作用
y的位为1
加x
移位一次
y的位为0
加0
移位一次
在计算机中,只需要设置三个寄存器
存放被乘数x
存放乘数以及乘积的低位
存放乘积高位
注意
原码一位乘中,参与运算的是真值的绝对值,所以移位时在高位加0
原码二位乘 天勤P47 王道没有
与一位乘的关系
相同点
运算时,符号位和数值位分开计算
不同点
一位乘每次都用乘数的一位决定新的部分积
二位乘每次都用乘数的两位决定新的部分积
乘数-新的部分积 关系
00
新部分积等于原部分积右移2位
01
新部分积等于原部分积加被乘数后右移2位
10
新部分积等于元部分积加2倍被乘数后右移2位
11
新部分积等于元部分积加3倍被乘数后右移2位
补码一位乘*** 天勤P49 重点^2
校正法
基本规则
1、y为正时,移位运算应该按照补码的算术移位进行操作
2、y为负时,移位运算应该按照补码的算术移位进行操作,并对结果加上[-x]_补 进行校正
详细规则
与原码一位乘基本相同,但是y为负数时,结果要加上[-x]_补 校正
比较法(booth算法)
规则统一,不随乘数符号的改变而改变
运算规则
被乘数与部分积使用双符号位,且符号位参与运算
乘数使用单符号位以决定最后一位是否需要校正,即是否加上[-x]_补
乘数末尾加设附件位y_{n+1},初始值为0
根据y_n、y_{n+1}判断位进行运算
00
y_{n+1}-y_n的值为0
部分积右移一位
01
y_{n+1}-y_n的值为1
部分积加[x]_补,再右移一位
10
y_{n+1}-y_n的值为-1
部分积加[-x]_补,再右移一位
11
y_{n+1}-y_n的值为0
部分积右移一位
第n+1步运算时,不再移位,仅根据y_0、y_1的值判断是否加[-x]_补
部分积为正时,右移高位补0;部分积为负时,右移高位补1
双符号位
次高符号位参与移位
高符号位不参与移位
补码二位乘 了解即可
定点数除法
原码恢复除法 天勤P52
符号位单独处理
异或
数值部分
转换为两个绝对值相除
由于小数范围限制,被除数和除数需要被约束
0<|被除数|<|除数|
定点小数
0<|被除数|<|除数|
定点整数
若余数为正,说明|当前余数|-|除数|>0,够减
上商1
左移一位
减去[y]_补
相当于加上[-y]_补
若余数为负,说明|当前余数|-|除数|<0,不够减
上商0
第一次运算上商一定是0
恢复余数
加上除数(的原码)
左移一位
减去[y]_补
相当于加上[-y]_补
恢复余数
根据移位次数调整余数
缺点
恢复余数的次数不确定
原码不恢复余数法(加减交替法)
关键
把恢复余数的步骤定量表示
余数大于0
R'=2R-y*
余数小于0
R'=2(R+y*)-y*=2R+y*
所以要么是左移一位减y*,要么是左移一位加y*
步骤
当前余数大于0
左移一位
减去[y]_补
相当于加上[-y]_补
当前余数小于0
左移一位
加上[y]_补
补码恢复余数法(不要求)
补码不恢复余数法(加减交替法) 天勤P55
对于小数的补码运算,允许商为-1
符号位参与运算
需要解决的问题 example 天勤P57
如何比较[x]_补 和 [y]_补的大小关系以确定商值
被除数与除数同号
做减法
余数与除数同号
够减
余数与除数异号
不够减
被除数与余数异号
做加法
余数与除数同号
够减
余数与被除数同号
余数与除数异号
不够减
如何形成商的符号
上商规则
若商为负,则除末尾外,其余任何一位的商与真实的商都恰好相反
若[x]_补和[y]_补同号,商为正数,则
够减时,上商1
不够减时,上商0
若[x]_补和[y]_补异号,商为负数,则
够减时,上商0
不够减时,上商1
但是实际上,“同号+够减” 以及 “异号+够减”不可能出现
所以上商规则简化为
[R]_补和[y]_补
同号
上商1
异号
上商0
如何确定新余数
[R]_补和[y]_补
同号
商1
余数
[R_{i+1}]_补=2[R_i]_补+[-y]_补
异号
商0
余数
[R_{i+1}]_补=2[R_i]_补+[y]_补
2.3浮点数的表示和运算
浮点数的表示
所有的小数都可以表示为
S=r^E+M
S :真值
r:底
E:阶码
M:尾码
一般情况下,底r省略
浮点数的一般格式
阶码E
e_s阶码符号位
e阶码数值位
尾数M
m_s尾数符号位
m尾数数值位
性质
阶码的位数反映浮点数的表示范围以及小数点的位置
尾数的位数反映浮点数的精度
尾数的符号位是整个浮点数的符号位
尾数为纯小数,常用原码or补码表示
阶码为定点整数,常用补码or移码表示
IEEE 754
基本格式
数符S
阶码(包括阶符)
移码
可以直观看出数的大小
方便阶操作
尾数
原码
分类
短实数
S
1
阶码
8
尾数
23
总位数
32
最大指数
+127
最小指数
-126
指数偏移量
+127
长实数
S
1
阶码
11
尾数
52
总位数
64
最大指数
+1023
最小指数
-1022
指数偏移量
+1023
临时实数
S
1
阶码
15
尾数
64
总位数
80
偏移量
+16383
性质
短实数和长实数的尾数省略第一个1(小数点前的)
临时实数不省略
允许使用非规格化的浮点数
浮点数的加/减运算
浮点数规格化
设尾数为W
当1/2<=|W|<1时,浮点数为规格化数
原码and正数补码:0.1xxxxx
第一数位是1就行
负数补码:1.0xxxxx
注
-1/2的补码是1.10000,但是不满足补码负数的格式,故不是规格化数
-1的补码是规格化数
加减运算步骤
对阶
修改阶码和尾码,使得参与运算的两个阶码相等
尾数求和
尾数相加or相减
结果规格化
舍入
要考虑尾数右移时丢失的数值
检查结果是否溢出
2.4算术逻辑单元ALU
串行加法器和并行加法器
加法单元 (全加器)
三端输入
A_i
加数
B_i
加数
C_{i-1}
低位进位
两端输出
C_i
传出进位
输入的三位中1的个数大于等于2时
1
Sigma_i
输入的三位有奇数个1时
1
输入的三位有偶数个1时
0
串行加法器
只有一个全加器称为串行加法器
并行加法器
若干个全加器组成
串行进位链
每一个加法器都要等待上一个加法器的传出进位
并行进位链
每一级进位直接依赖于前一级的进位
单重分组跳跃进位链
双重分组跳跃进位链
ALU的功能和结构
数字电路
组合逻辑电路
时序逻辑电路
ALU电路框架
输入
A_i
输入变量
B_i
输入变量
K_i
控制信号
输出
F_i
74181
4位ALU电路
组内并行
74182
先行进位部件
作用
将74181芯片之间的进位变成并行进位