校验码
元件故障\噪声干扰等各种因素常常导致计算机在处理信息过程中出现错误,为了防止错误,可将信号采用专门的逻辑线路进行编码以检测错误,通常的做法是在每个字上添加一些校验位过来确定字中出现错误的位置。
奇偶校验码
组成奇偶校验码的基本方法:在n位有效信息位上增加一个二进制校验位,构成一个n+1位奇偶校验码。
奇校验:使n+1位的奇偶校验码中1的个数为奇数
偶校验:使n+1位的奇偶校验码中1的个数为偶数
缺点:多位出错无法检测
定点数的运算
补码加法运算:
负数用补码表示后,可以和正数一样来处理,即当需要减去一个数x时,可以加上x对应的负数的补码[-x]补来代替
补码的加法公式:
[x]补 + [y]补 = [x + y]补
注:符号位和数值位统一进行加法处理
补码减法运算公式
[x]补 + [-y]补 = [x - y]补
补码运算的基本规则
1. 运算的各个操作数均是补码表示,运算结果仍是补码;
2. 符号位与数值位一样参加运算;
3. 若求和,则将两补码数直接相加,得到两数之和的补码;若求差,则将减数变成补码(由[y]补求[-y]补),然后与被减数相加,得到两数之差的补码;
4. 补码是对于确定的模而言,若运算结果超过模(有从符号位上产生的进位),则将模自动丢掉。
溢出概念与检测
两个正数相加的结果为负数,两个负数相加结果为正数这显然都是错的
检测方法一:两个同号的数相加结果发生了改变(即变号了)则发生了溢出(两个异号数的相加不会发生溢出)
检测方法二:双符号位法,符号位有两位用“00”表示正,“11”表示负。如果两个数相加后,其结果出现“00”或者”11“则表示没有溢出,出现”01“或”10“两种组合时,表示溢出
检测方法三:单符号位法,当最高数值位产生进位而符号位无进位时,产生上溢,当最高数值位无进位而符号位有进位时,产生下溢
即:当最高数值位和符号位都进位时或者都没进位则没溢出,如果只有一者有进位则溢出
任何数和0异或不变,和1异或取反;
定点数乘法运算
原码一位乘法:计算机乘法运算执行过程
总体步骤:
(1) 乘积的符号位进行异或(相同得0即为正,不同得1即为负),确定数值的符号位
(2) 数值部分按绝对值相乘
A=-0.1101 B=0.1011 计算 A*B,执行过程如下
做加减法是针对补码的原则进行:所以求出|A|补=0.1101,|B|补=0.1011;即绝对值的补码是其本身
定点除法运算
总体步骤:
(1) 符号位进行异或(相同得0即为正,不同得1即为负),确定数值的符号位
(2) 数值部分按绝对值相除
1. 恢复余数法
所谓恢复余数法就是先作减法,若余数为正,才知道够减;若余数为负,才知道不够减。不够减时必须恢复原来的余数,以便再继续往下运算。这种方法称为恢复余数法。要恢复原来的余数,只要当前的余数加上除数即可。
例:
x=-0.1011 y=-0.1101,则|x|补=0.1011 |y|补=0.1101 [-|y|]补=1.0011
(正数的补码是其本身,负数的补码等于其正数补码各位取反末位加1)
注意明确一点:作差相当于加负数的绝对值的补码,即将减法转换为加法,所以需要求出[-|y|]补
步骤说明:
(1) 首先做减法,即[|x|]补 - [|y|]补 = [|x|]补 + [-|y|]补 如果结果>0,则商1,然后除数右移一位2^-1 y,
(2) 如果结果<0,则商0,然后恢复余数即结果值(余数)加上除数[|y|]补,即还原上一个余数的值,然后除数右移一位2^-1 y
然后依次重复1、2步
2.加减交替法
对于恢复余数法,使除法进行过程的步数不固定,因此控制比较复杂
实际中常用不恢复余数法,又称加减交替法。其特点是运算过程中如出现不够减,则不必恢复余数,根据余数符号,可以继续往下运算,一次步数固定,控制简单。
分析:不够减时的情况
第一步:当某次减除数操作使得余数为负值时应该商“0”,并加除数恢复余数
第二步:下一步的操作是右移一位除数,再减去这个右移一位得除数。
若用R表示某次的负余数,用B表示除数,那么上述两步操作可表示为:
R+B - B*2^-1=R+ B*2^-1 (B*2^-1表示B/2即右移一位)
即(原码加减交替法运算的法则)
方法一:针对除数的右移
(1) 若够减(余数>=0),商“1”,除数右移一位,减去这个右移的除数,
(2) 若不够减(余数<0),商“0”,除数右移一位,加上这个右移的除数
方法二:针对余数的左移
(1) 若够减(余数>=0),商“1”,余数左移一位,减去这个除数
(2) 若不够减(余数<0),商“0”,余数左移一位,加上这个除数
即在进行原码除法运算时,我们可以通过两种方式实现,即除数的右移或者是余数的左移(注意:要么就全部是余数的左移方式,要么就全部是除数的右移方式,切忌不可混合乱用,两种方式择一即可)
总结
除法就不断的做”减法“,当遇到余数>=0时,商1,右移一位得除数,余数继续减去移位后的除数;如果余数<0,则商0,然后除数右移一位,此时余数要加上右移后的除数,然后再做减法(减去除数),如此往复。
即:一直做减法,遇到余数<0,则先做加法再做减法