第六章 计算机中数的表示和计算
一、定点数表示
- 小数点位置固定,放在字首称小数定点,放在字尾称整数定点
- 定点表示机器只能表示纯的整数或纯的小数,不能表示实数
1、无符号数:最高位不是符号位
(1)整数定点:小数点放在字尾
例:以8位二进制为例,格式如下:
(2)小数定点:小数点放在字首
例:以8位二进制为例,格式如下:
2、有符号数:最高位是符号位,有效数值相应少一位
(1)整数定点:小数点放在字尾,最高位为符号位Sf
(2)小数定点:最高位为符号位Sf,小数点放在Sf之后
3、有符号数的码制
(1)原码 - 数值不变,正数符号位Sf =0,负数符号位Sf =1,“0”值形式不唯一
例: X = +1010 则[X]原 = 0,1010
X = -1010 则[X]原 = 1,1010
(2)补码 - 正数符号位Sf =0,负数符号位Sf =1
- 正数数值不变,负数数值各位取反,末位加1
- “0”值形式唯一
例: X = +1010 则[X]补 = 0,1010 正数形式与原码一样
X = -1010 则[X]原 = 1,0101 + 0001= 1,0110
附加:* 已知一个补码,求其负值的补码,只需连同符号位一起,各位取反,末位加1 - 变形补码:符号位取两位,则其含义如下:
00表示正数、11表示负数、01表示正溢出、10表示负溢出
(3)反码 - 正数符号位Sf =0,负数符号位Sf =1
- 正数数值不变,负数数值各位取反
- “0”值形式不唯一
例: X = +1010 则[X]反 = 0,1010 正数形式与原码和补码一样
X = -1010 则[X]反 = 1,0101
(4)移码 - 正数符号位Sf =1,负数符号位Sf =0,与前三种码不同
- 正数数值不变,负数数值各位取反,末位加1,与补码相同
- “0”值形式唯一
例: X = +1010 则[X]反 = 1,1010
X = -1010 则[X]反 = 0,0101+ 0001= 0,0110 与补码就符号位不同
特点:直接从码的数值上,就可以判断出其真值的大小关系
二、浮点数表示
* 小数点的位置可以浮动,通过改变阶码值来实现
1、格式
数学意义: N = S × 2J,S用纯小数,表数的精度,J用纯整数,表数的范围
例:设上述浮点格式n为8位,m为6位,均用补码,把(-17.25)表示成浮点数。
则(-17.25)二进制数对应为(-10001.01),变成数学形式(-0.1000101×2101),其中除了阶底2为十进制数,其余皆为二进制,阶码为101(即十进制的5),尾数小数点左移了五位。
按上述格式补齐数位,尾数在数后补0,阶码在数前补0。
则上数变为(-0.10001010×2000101),尾数补码(1,01110110),阶码补码(0,000101)。
该数值整体表示成:0,000101;1,01110110。
2、表数范围(仅描述正数区间,负数只差符号)
|X|MAX=(1-2-n)×2K,其中K=2m-1
|X|MIN=(2-n)×2-K,其中K=2m-1
注意:此区间没包括0值
3、0值的浮点表示
- 理解尾数的真正意义,表示数值序列,只是没有小数点
- 理解阶码的真正意义,表示小数点的具体位置,正数在数值序列的后面(值变大),负数在数值序列的前面(值变小)
- 0值的表示:数值序列为0,且值变为最小(阶码为负值,且绝对值最大)
例:设上述浮点格式n为8位,m为6位,均用补码,表示0值。
则0值表示成,尾数(0,00000000) ,阶码(1,000000),阶码为负值,且绝对值最大。该0值整体表示成:1,000000;0,00000000。
注意:浮点0值若用补码表示则不是全0形式,硬件判断麻烦,所以有的机器数阶码用移码表示,尾数还用补码。
4、规格化
原因:保证有效数值尽可能最大化
形式:要求1>|S|≥(1/2),即尾数第一位S1=1
表数范围:|X|MIN=(2-1)×2-K,其中K=2m-1,|X|MAX同上
5、定点数与浮点数的比较
(1)字长一定时,定点表数精度高,浮点表数范围大;
(2)字长不同时(通常浮点表示字长要比定点表示长),浮点表数即精度高,又范围大;
(3)浮点运算比定点运算慢,浮点数是两部分,要分别处理;
(4)判断溢出时,定点数判断数值本身,浮点数判断阶码。
三、定点数的运算
1、移位运算
(1)逻辑移位:最高位不是符号位
规则:左移低位补0,右移高位补0
(2)算术移位:最高位为符号位,保持不变,仅对数值操作
规则:正数数值操作,左移低位补0,右移高位补0,不考虑码制
负数数值操作,原码时,左移低位补0,右移高位补0
反码时,左移低位补1,右移高位补1
补码时,左移低位补0,右移高位补1
(3)算术移位对结果的影响
正数数值操作时,不考虑码制,左移高位丢1,错误,右移低位丢1,误差
负数数值操作时,原码时,左移高位丢1,错误,右移低位丢1,误差
反码时,左移高位丢0,错误,右移低位丢0,误差
补码时,左移高位丢0,错误,右移低位丢1,误差
注意:负数的补码可以理解为原码和反码的组合体,左为反码,右为原码
2、加减法运算
- 仅描述补码规则,因为补码减法实际也是加操作,硬件简单,没有减法器
基本公式:[A]补+[B]补=[S]补 (mod M)
[A]补-[B]补=[A]补+[-B]补=[S]补 (mod M)
规则:加法直接加上加数的补码,减法加上负值加数的补码
注意:已知加数的补码,只需把其连同符号位一起,各位取反,末位加1,即为其负值加数的补码
溢出判断规则:同号相加,结果异号,则溢出 - 判断A0=B0且A0≠S0是否同时成立,成立即溢出
附加:
(1)一位加法器逻辑组成,某位运算对应关系如下:
则上述对应的逻辑关系为:Si=Ai 异或Bi ,Ci=Ai 与Bi - 计算机其实是一种逻辑,不是真的计算,所有的运算均通过逻辑实现
对应的逻辑关系图如下(可有数字电路实现):
习惯上,在书上的讲解中把具体内容省略,再加上一个低位进位,抽象为下图:
(2)多位加法器的逻辑组成,下图以四位为例,1位为高位,4位为低位
(3)并行补码加法器逻辑组成,n+1位(n位数值,1位符号位)
Gs为减法标记,控制加数(当减法有效,X里各位取反,无效时,X里值不变)
3、乘法运算
(1)原码一位乘 - 手算的计算机仿真,运算时符号单处理,绝对值参与运算
- 计算机中数多为补码,所以运行时需码制转换
规则:根据乘数yi的数值来决定如何运算
当yi=0时,部分积加|x|,然后部分积右移一位
当yi=1时,部分积加0,然后部分积右移一位
例:[x]原=1.1110,[y]原=1.1101,求[x*y]原
符号单处理,x0=1,y0=1,则积符=x0异或y0=0
运算时用绝对值,|x|=0.1110,|y|=0.1101,运算过程见下表
小结:假设字长n位(不含符号位,上例n=4) - 部分积取n+1位,多的一位不是符号位,而是缓冲位,n位加法和可能为n+1位
- 乘数取n位,仅取数值字长,不含符号位
- 进行了n次加法,n次移位,加0也算一次
- 移位采用逻辑移位规则,部分积和乘数一起参与
- 计算过程中,若部分积最高位z0为1,不认为溢出,继续运算
(2)补码一位乘
- 补码运算过程中,补码直接参与运算,即符号位参与运算
布斯比较规则:根据乘数yi和附加的yi+1的数值来决定如何运算
当yi yi+1=00时,部分积加0,然后部分积右移一位
当yi yi+1=01时,部分积加[x]补,然后部分积右移一位
当yi yi+1=10时,部分积加[-x]补,然后部分积右移一位
当yi yi+1=11时,部分积加0,然后部分积右移一位
例:[x]补=0.0011,[y]补=1.0111,求[x*y]补
计算时部分积取两位符号位,上述[x]补的相应数值如下:
[x]补=00.0011,符号位两位,11表示负数,00表示正数
[-x]补=11.1101,负值补码,连同符号位一起,各位取反,末位加1
运算过程见下表
小结:假设字长n位(不含符号位,上例n=4) - 部分积取n+2位,多的两位一位是符号位,另一位是缓冲位,因补码运算符号参与运算,实际上是n+1位的加法,则和可能为n+2位
- 乘数取n+1位,符号参与运算,尾部再附加yi+1,初始yi+1为0
- 进行了n+1次加法,n次移位,最后一次只加不移位
- 移位采用补码算术移位规则,仅两位符号的最高位保持不变,即仅两位符号的最高位为真实的符号位,另一位符号位是缓冲位,部分积和乘数一起参与
- 运算的结果即为补码,不需要再转换
(3)补码一位乘法器的逻辑结构
译码器为2:4译码,控制门为与或门
4、除法运算
补码加减交替规则:符号参与运算
(1)初始操作,如果被除数[x]补与除数[y]补符号相同,上商0,执行[x]补-[y]补=[r]补
如果被除数[x]补与除数[y]补符号不同,上商1,执行[x]补+[y]补=[r]补
(2)后续操作,如果余数[r]补与除数[y]补同号,上商1,执行2[r]补-[y]补,生成新的[r]补
如果余数[r]补与除数[y]补异号,上商0,执行2[r]补+[y]补,生成新的[r]补
例:[x]补=1.0101,[y]补=0.1101,求[x/y]补
计算时余数取两位符号位,则[x]补的相应变为[x]补=11.0101,计算时需要[-y]补=11.0011
运算过程见下表
小结:假设字长n位(不含符号位,上例n=4)
- 余数取n+2位,多的两位一位是符号位,另一位是缓冲位,因补码运算符号参与运算,实际上是n+1位的加法,则和可能为n+2位
- 商取n+1位,上商n+1次,第一次上商判断是否溢出,最后一次恒置1
- 进行了n次加法,n次移位
- 移位采用逻辑移位规则,最高位舍掉,低位补0
- 运算的结果即为补码,如首位符号和逻辑不符,则溢出
注意:仅乘法没有溢出,加、减、除均有溢出可能
四、浮点数的运算
1、浮点数的加减运算
设X = Sx× 2Jx,Y = Sy× 2Jy,计算X±Y
(1)对阶:对齐两数的阶码
- 原则是小阶向大阶对齐
(2)尾数求和:对齐阶码后,计算Sx±Sy
(3)规格化 - 习惯上符号取两位
- 判断形势(补码规则):00.1﹡﹡﹡或11.0﹡﹡﹡
- 左规:当尾数为00.0﹡﹡﹡或11.1﹡﹡﹡时,左移尾数,直至符号位与小数点后第一位互异为止
- 右规:当尾数为01.﹡﹡﹡或10.﹡﹡﹡时,右移尾数,只需一次
注意:左规和右规二者只需做一种,判断时,先看是否右规,再看是否左规
(4)舍入处理 - 0舍1入:丢掉的数值最高位如为1,保留的数值末位加1,否则加0
- 末位恒1:保留的数值末位置1(注意不是加1)
例:设X =0.1101×201,Y =-0.1010×211,其中除了阶底2为十进制数,其余皆为二进制,计算X+Y,字长格式(2+3;2+6),均采用补码。
则 [X]补=00,001;00.110100
[Y]补=00,011;11.011000
对阶 阶差=[Jx]补+[-Jy]补=00,001+11,101=11,110﹤0
对X的阶码,[X]补变为00,011;00.001101
尾和 和的尾数=[Sx]补+[Sy]补=00.001101+11.011000=11.100101
[X+Y]补=00,011;11.100101 - 对阶之后的阶码,求尾数和之后的尾数和
规格化 上述结果尾数形式判断,不需右规,需要左规(仅需一位即可)
[X+Y]补变为00,010;11.001010 //尾数左移一位,阶码减1
判断溢出 阶码没有溢出,上述值为结果
2、浮点数的乘除运算
运算步骤:(1)阶码相加减
(2)尾数相乘除
(3)规格化
(4)判断溢出
结论:浮点运算其实是通过定点运算完成的
五、面向错误检测与纠错的数据编码
*编码最小距离:某种编码系统中,任意两个相邻码之间最少的二进制不同位数(用L表示)
*纠错理论: L-1=D+C 且 D≥C (其中D代表检测错码个数、C代表纠正错码个数)
1、奇偶校验码
*正常编码码距L均为1,套用上述纠错理论公式,结果是既不能检错,也不能纠错
*要想检错只能增加码距,奇偶校验码附加一位,下表在码末位附加一位,码距L变为2
特点:
(1)原理简单,宜于实现。
(2)只能检错,不能纠错,即知道有数位出错了,具体是哪一位不能确定。处理的方法只能是重新处理一遍。
2、海明码(Hamming)
- 附加多位,使码距大于2,则D和C均可大于1,即可检错又可纠错
- 实际上是奇偶校验码的扩展,内部是多组奇偶校验码
- 附加数位K和原编码尾数N之间应满足:2K≥N+K+1,具体对应数值见下表
其余数值套用公式可以得到
例如,N=4时(分别记为b4b3b2b1),需附加K=3(分别记为C4C2C1),具体位置安排如下: - 因为附加三位,实际上内部包含三组
- 分组特点
(1)每个小组有一位且仅有一位为它独有数位
(2)每两个小组共同占有一位其他小组没有的数位
(3)每三个小组共同占有一位其他小组没有的数位
如果附加位数越多,内部分组越多,分组特点按上述类推,上例具体分组如下:
C1对应第一组,相应数位为1、3、5、7
C2对应第二组,相应数位为2、3、6、7
C4对应第三组,相应数位为4、5、6、7 //满足上述分组特点
组码 当b4b3b2b1=1100,按上述分组分别计算,则
C1=b4⊕b3⊕b1=1⊕1⊕0=0
C2=b4⊕b2⊕b1=1⊕0⊕0=1
C4=b3⊕b2⊕b1=1⊕0⊕0=1
所以,按上表位置排列,相应的海明码为0111100
校验 假设正确的海明码(0111100)有一位出错,变为(0111000),按分组校验
P1=1⊕3⊕5⊕7=0⊕1⊕0⊕0=1 //1、3、5、7指代对应的数位
P2=2⊕3⊕6⊕7=1⊕1⊕0⊕0=0
P4=4⊕5⊕6⊕7=1⊕0⊕0⊕0=1
把上述结果组成二进制数,P4 P2 P1=101B,对应十进制数为5,即第5位出错,如无错,则P4 P2 P1=000B,不指代任何数位。
注意:海明码仅能纠正一位出错,如多于一位出错,则海明码无法处理第六章 计算机中数的表示和计算
一、定点数表示
-
小数点位置固定,放在字首称小数定点,放在字尾称整数定点
-
定点表示机器只能表示纯的整数或纯的小数,不能表示实数
1、无符号数:最高位不是符号位
(1)整数定点:小数点放在字尾
例:以8位二进制为例,格式如下:0 0 0 0 0 0 0 0 真值为0 0 0 0 0 0 0 0 1 真值为1 … 1 1 1 1 1 1 1 1 真值为28-1=255
(2)小数定点:小数点放在字首
例:以8位二进制为例,格式如下:
0.0 0 0 0 0 0 0 0 真值为0
0.0 0 0 0 0 0 0 1 真值为2-8
…
0.1 1 1 1 1 1 1 1 真值为1-2-8
2、有符号数:最高位是符号位,有效数值相应少一位
(1)整数定点:小数点放在字尾,最高位为符号位Sf
(2)小数定点:最高位为符号位Sf,小数点放在Sf之后
3、有符号数的码制
(1)原码
- 数值不变,正数符号位Sf =0,负数符号位Sf =1,“0”值形式不唯一
例: X = +1010 则[X]原 = 0,1010
X = -1010 则[X]原 = 1,1010
(2)补码 - 正数符号位Sf =0,负数符号位Sf =1
- 正数数值不变,负数数值各位取反,末位加1
- “0”值形式唯一
例: X = +1010 则[X]补 = 0,1010 正数形式与原码一样
X = -1010 则[X]原 = 1,0101 + 0001= 1,0110
附加:* 已知一个补码,求其负值的补码,只需连同符号位一起,各位取反,末位加1 - 变形补码:符号位取两位,则其含义如下:
00表示正数、11表示负数、01表示正溢出、10表示负溢出
(3)反码 - 正数符号位Sf =0,负数符号位Sf =1
- 正数数值不变,负数数值各位取反
- “0”值形式不唯一
例: X = +1010 则[X]反 = 0,1010 正数形式与原码和补码一样
X = -1010 则[X]反 = 1,0101
(4)移码 - 正数符号位Sf =1,负数符号位Sf =0,与前三种码不同
- 正数数值不变,负数数值各位取反,末位加1,与补码相同
- “0”值形式唯一
例: X = +1010 则[X]反 = 1,1010
X = -1010 则[X]反 = 0,0101+ 0001= 0,0110 与补码就符号位不同
特点:直接从码的数值上,就可以判断出其真值的大小关系
二、浮点数表示
* 小数点的位置可以浮动,通过改变阶码值来实现
1、格式
数学意义: N = S × 2J,S用纯小数,表数的精度,J用纯整数,表数的范围
例:设上述浮点格式n为8位,m为6位,均用补码,把(-17.25)表示成浮点数。
则(-17.25)二进制数对应为(-10001.01),变成数学形式(-0.1000101×2101),其中除了阶底2为十进制数,其余皆为二进制,阶码为101(即十进制的5),尾数小数点左移了五位。
按上述格式补齐数位,尾数在数后补0,阶码在数前补0。
则上数变为(-0.10001010×2000101),尾数补码(1,01110110),阶码补码(0,000101)。
该数值整体表示成:0,000101;1,01110110。
2、表数范围(仅描述正数区间,负数只差符号)
|X|MAX=(1-2-n)×2K,其中K=2m-1
|X|MIN=(2-n)×2-K,其中K=2m-1
注意:此区间没包括0值
3、0值的浮点表示
- 理解尾数的真正意义,表示数值序列,只是没有小数点
- 理解阶码的真正意义,表示小数点的具体位置,正数在数值序列的后面(值变大),负数在数值序列的前面(值变小)
- 0值的表示:数值序列为0,且值变为最小(阶码为负值,且绝对值最大)
例:设上述浮点格式n为8位,m为6位,均用补码,表示0值。
则0值表示成,尾数(0,00000000) ,阶码(1,000000),阶码为负值,且绝对值最大。该0值整体表示成:1,000000;0,00000000。
注意:浮点0值若用补码表示则不是全0形式,硬件判断麻烦,所以有的机器数阶码用移码表示,尾数还用补码。
4、规格化
原因:保证有效数值尽可能最大化
形式:要求1>|S|≥(1/2),即尾数第一位S1=1
表数范围:|X|MIN=(2-1)×2-K,其中K=2m-1,|X|MAX同上
5、定点数与浮点数的比较
(1)字长一定时,定点表数精度高,浮点表数范围大;
(2)字长不同时(通常浮点表示字长要比定点表示长),浮点表数即精度高,又范围大;
(3)浮点运算比定点运算慢,浮点数是两部分,要分别处理;
(4)判断溢出时,定点数判断数值本身,浮点数判断阶码。
三、定点数的运算
1、移位运算
(1)逻辑移位:最高位不是符号位
规则:左移低位补0,右移高位补0
(2)算术移位:最高位为符号位,保持不变,仅对数值操作
规则:正数数值操作,左移低位补0,右移高位补0,不考虑码制
负数数值操作,原码时,左移低位补0,右移高位补0
反码时,左移低位补1,右移高位补1
补码时,左移低位补0,右移高位补1
(3)算术移位对结果的影响
正数数值操作时,不考虑码制,左移高位丢1,错误,右移低位丢1,误差
负数数值操作时,原码时,左移高位丢1,错误,右移低位丢1,误差
反码时,左移高位丢0,错误,右移低位丢0,误差
补码时,左移高位丢0,错误,右移低位丢1,误差
注意:负数的补码可以理解为原码和反码的组合体,左为反码,右为原码
2、加减法运算
- 仅描述补码规则,因为补码减法实际也是加操作,硬件简单,没有减法器
基本公式:[A]补+[B]补=[S]补 (mod M)
[A]补-[B]补=[A]补+[-B]补=[S]补 (mod M)
规则:加法直接加上加数的补码,减法加上负值加数的补码
注意:已知加数的补码,只需把其连同符号位一起,各位取反,末位加1,即为其负值加数的补码
溢出判断规则:同号相加,结果异号,则溢出 - 判断A0=B0且A0≠S0是否同时成立,成立即溢出
附加:
(1)一位加法器逻辑组成,某位运算对应关系如下:
Ai Bi Si(和值) Ci(对应的进位)
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
则上述对应的逻辑关系为:Si=Ai 异或Bi ,Ci=Ai 与Bi - 计算机其实是一种逻辑,不是真的计算,所有的运算均通过逻辑实现
对应的逻辑关系图如下(可有数字电路实现):
习惯上,在书上的讲解中把具体内容省略,再加上一个低位进位,抽象为下图:
(2)多位加法器的逻辑组成,下图以四位为例,1位为高位,4位为低位
(3)并行补码加法器逻辑组成,n+1位(n位数值,1位符号位)
Gs为减法标记,控制加数(当减法有效,X里各位取反,无效时,X里值不变)
3、乘法运算
(1)原码一位乘
- 手算的计算机仿真,运算时符号单处理,绝对值参与运算
- 计算机中数多为补码,所以运行时需码制转换
规则:根据乘数yi的数值来决定如何运算
当yi=0时,部分积加|x|,然后部分积右移一位
当yi=1时,部分积加0,然后部分积右移一位
例:[x]原=1.1110,[y]原=1.1101,求[xy]原
符号单处理,x0=1,y0=1,则积符=x0异或y0=0
运算时用绝对值,|x|=0.1110,|y|=0.1101,运算过程见下表
部分积z 乘数y 操作说明
0.0000
+0.1110 1101
加|x|
0.1110
0.0111
+0.0000
0 110
右移一位
加0
0.0111
0.0011
+0.1110
10 11
右移一位
加|x|
1.0001
0.1000
+0.1110
110 1
右移一位
加|x|
1.0110
0.1011
0110
右移一位
则[xy]原=0.10110110
小结:假设字长n位(不含符号位,上例n=4) - 部分积取n+1位,多的一位不是符号位,而是缓冲位,n位加法和可能为n+1位
- 乘数取n位,仅取数值字长,不含符号位
- 进行了n次加法,n次移位,加0也算一次
- 移位采用逻辑移位规则,部分积和乘数一起参与
- 计算过程中,若部分积最高位z0为1,不认为溢出,继续运算
(2)补码一位乘
- 补码运算过程中,补码直接参与运算,即符号位参与运算
布斯比较规则:根据乘数yi和附加的yi+1的数值来决定如何运算
当yi yi+1=00时,部分积加0,然后部分积右移一位
当yi yi+1=01时,部分积加[x]补,然后部分积右移一位
当yi yi+1=10时,部分积加[-x]补,然后部分积右移一位
当yi yi+1=11时,部分积加0,然后部分积右移一位
例:[x]补=0.0011,[y]补=1.0111,求[xy]补
计算时部分积取两位符号位,上述[x]补的相应数值如下:
[x]补=00.0011,符号位两位,11表示负数,00表示正数
[-x]补=11.1101,负值补码,连同符号位一起,各位取反,末位加1
运算过程见下表
部分积z 乘数y 附加yi+1 操作说明
00.0000
+11.1101 10111 0
加[-x]补
11.1101
11.1110
+00.0000
1 1011 1
右移一位
加0
11.1110
11.1111
+00.0000
01 101 1
右移一位
加0
11.1111
11.1111
+00.0011
101 10 1
右移一位
加[x]补
00.0010
00.0001
+11.1101
0101 1 0
右移一位
加[-x]补
11.1110 0101
则[xy]补=1.11100101
小结:假设字长n位(不含符号位,上例n=4) - 部分积取n+2位,多的两位一位是符号位,另一位是缓冲位,因补码运算符号参与运算,实际上是n+1位的加法,则和可能为n+2位
- 乘数取n+1位,符号参与运算,尾部再附加yi+1,初始yi+1为0
- 进行了n+1次加法,n次移位,最后一次只加不移位
- 移位采用补码算术移位规则,仅两位符号的最高位保持不变,即仅两位符号的最高位为真实的符号位,另一位符号位是缓冲位,部分积和乘数一起参与
- 运算的结果即为补码,不需要再转换
(3)补码一位乘法器的逻辑结构
译码器为2:4译码,控制门为与或门
4、除法运算
补码加减交替规则:符号参与运算
(1)初始操作,如果被除数[x]补与除数[y]补符号相同,上商0,执行[x]补-[y]补=[r]补
如果被除数[x]补与除数[y]补符号不同,上商1,执行[x]补+[y]补=[r]补
(2)后续操作,如果余数[r]补与除数[y]补同号,上商1,执行2[r]补-[y]补,生成新的[r]补
如果余数[r]补与除数[y]补异号,上商0,执行2[r]补+[y]补,生成新的[r]补
例:[x]补=1.0101,[y]补=0.1101,求[x/y]补
计算时余数取两位符号位,则[x]补的相应变为[x]补=11.0101,计算时需要[-y]补=11.0011
运算过程见下表
余数 商 操作说明
11.0101
+00.1101 0.0000 商初始值全0
[x]补与[y]补异号,+[y]补
00.0010
00.0100
+11.0011 1
1 [r]补与[y]补同号,商1
2[r]补,即左移一位
+[-y]补
11.0111
10.1110
+00.1101 10
10 [r]补与[y]补异号,商0
左移一位
+[y]补
11.1011
11.0110
+00.1101 100
100 [r]补与[y]补异号,商0
左移一位
+[y]补
00.0011
00.0110 1001
10011 [r]补与[y]补同号,商1
左移一位,末位恒1
[x/y]补=1.0011
小结:假设字长n位(不含符号位,上例n=4)
- 余数取n+2位,多的两位一位是符号位,另一位是缓冲位,因补码运算符号参与运算,实际上是n+1位的加法,则和可能为n+2位
- 商取n+1位,上商n+1次,第一次上商判断是否溢出,最后一次恒置1
- 进行了n次加法,n次移位
- 移位采用逻辑移位规则,最高位舍掉,低位补0
- 运算的结果即为补码,如首位符号和逻辑不符,则溢出
注意:仅乘法没有溢出,加、减、除均有溢出可能
四、浮点数的运算
1、浮点数的加减运算
设X = Sx× 2Jx,Y = Sy× 2Jy,计算X±Y
(1)对阶:对齐两数的阶码
- 原则是小阶向大阶对齐
(2)尾数求和:对齐阶码后,计算Sx±Sy
(3)规格化 - 习惯上符号取两位
- 判断形势(补码规则):00.1﹡﹡﹡或11.0﹡﹡﹡
- 左规:当尾数为00.0﹡﹡﹡或11.1﹡﹡﹡时,左移尾数,直至符号位与小数点后第一位互异为止
- 右规:当尾数为01.﹡﹡﹡或10.﹡﹡﹡时,右移尾数,只需一次
注意:左规和右规二者只需做一种,判断时,先看是否右规,再看是否左规
(4)舍入处理 - 0舍1入:丢掉的数值最高位如为1,保留的数值末位加1,否则加0
- 末位恒1:保留的数值末位置1(注意不是加1)
例:设X =0.1101×201,Y =-0.1010×211,其中除了阶底2为十进制数,其余皆为二进制,计算X+Y,字长格式(2+3;2+6),均采用补码。
则 [X]补=00,001;00.110100
[Y]补=00,011;11.011000
对阶 阶差=[Jx]补+[-Jy]补=00,001+11,101=11,110﹤0
对X的阶码,[X]补变为00,011;00.001101
尾和 和的尾数=[Sx]补+[Sy]补=00.001101+11.011000=11.100101
[X+Y]补=00,011;11.100101 - 对阶之后的阶码,求尾数和之后的尾数和
规格化 上述结果尾数形式判断,不需右规,需要左规(仅需一位即可)
[X+Y]补变为00,010;11.001010 //尾数左移一位,阶码减1
判断溢出 阶码没有溢出,上述值为结果
2、浮点数的乘除运算
运算步骤:(1)阶码相加减
(2)尾数相乘除
(3)规格化
(4)判断溢出
结论:浮点运算其实是通过定点运算完成的
五、面向错误检测与纠错的数据编码
*编码最小距离:某种编码系统中,任意两个相邻码之间最少的二进制不同位数(用L表示)
*纠错理论: L-1=D+C 且 D≥C (其中D代表检测错码个数、C代表纠正错码个数)
1、奇偶校验码
*正常编码码距L均为1,套用上述纠错理论公式,结果是既不能检错,也不能纠错
*要想检错只能增加码距,奇偶校验码附加一位,下表在码末位附加一位,码距L变为2
十进制数 自然BCD码(NBCD) 奇校验码 偶校验码
0
1
2
3
4
5
6
7
8
9 0000
0001
0010
0011
0100
0101
0110
0111
1000
1001 00001
00010
00100
00111
01000
01011
01101
01110
10000
10011 00000
00011
00101
00110
01001
01010
01100
01111
10001
10010
特点:(1)原理简单,宜于实现。
(2)只能检错,不能纠错,即知道有数位出错了,具体是哪一位不能确定。处理的方法只能是重新处理一遍。
2、海明码(Hamming)
- 附加多位,使码距大于2,则D和C均可大于1,即可检错又可纠错
- 实际上是奇偶校验码的扩展,内部是多组奇偶校验码
- 附加数位K和原编码尾数N之间应满足:2K≥N+K+1,具体对应数值见下表
N K(最小)
1 2
2-4 3
5-11 4
12-26 5
其余数值套用公式可以得到
例如,N=4时(分别记为b4b3b2b1),需附加K=3(分别记为C4C2C1),具体位置安排如下:
二进制序号 1 2 3 4 5 6 7
名称 C1 C2 b4 C4 b3 b2 b1
- 因为附加三位,实际上内部包含三组
- 分组特点
(1)每个小组有一位且仅有一位为它独有数位
(2)每两个小组共同占有一位其他小组没有的数位
(3)每三个小组共同占有一位其他小组没有的数位
如果附加位数越多,内部分组越多,分组特点按上述类推,上例具体分组如下:
C1对应第一组,相应数位为1、3、5、7
C2对应第二组,相应数位为2、3、6、7
C4对应第三组,相应数位为4、5、6、7 //满足上述分组特点
组码 当b4b3b2b1=1100,按上述分组分别计算,则
C1=b4⊕b3⊕b1=1⊕1⊕0=0
C2=b4⊕b2⊕b1=1⊕0⊕0=1
C4=b3⊕b2⊕b1=1⊕0⊕0=1
所以,按上表位置排列,相应的海明码为0111100
校验 假设正确的海明码(0111100)有一位出错,变为(0111000),按分组校验
P1=1⊕3⊕5⊕7=0⊕1⊕0⊕0=1 //1、3、5、7指代对应的数位
P2=2⊕3⊕6⊕7=1⊕1⊕0⊕0=0
P4=4⊕5⊕6⊕7=1⊕0⊕0⊕0=1
把上述结果组成二进制数,P4 P2 P1=101B,对应十进制数为5,即第5位出错,如无错,则P4 P2 P1=000B,不指代任何数位。
注意:海明码仅能纠正一位出错,如多于一位出错,则海明码无法处理第六章 计算机中数的表示和计算
一、定点数表示
-
小数点位置固定,放在字首称小数定点,放在字尾称整数定点
-
定点表示机器只能表示纯的整数或纯的小数,不能表示实数
1、无符号数:最高位不是符号位
(1)整数定点:小数点放在字尾
例:以8位二进制为例,格式如下:0 0 0 0 0 0 0 0 真值为0 0 0 0 0 0 0 0 1 真值为1 … 1 1 1 1 1 1 1 1 真值为28-1=255
(2)小数定点:小数点放在字首
例:以8位二进制为例,格式如下:
0.0 0 0 0 0 0 0 0 真值为0
0.0 0 0 0 0 0 0 1 真值为2-8
…
0.1 1 1 1 1 1 1 1 真值为1-2-8
2、有符号数:最高位是符号位,有效数值相应少一位
(1)整数定点:小数点放在字尾,最高位为符号位Sf
(2)小数定点:最高位为符号位Sf,小数点放在Sf之后
3、有符号数的码制
(1)原码
- 数值不变,正数符号位Sf =0,负数符号位Sf =1,“0”值形式不唯一
例: X = +1010 则[X]原 = 0,1010
X = -1010 则[X]原 = 1,1010
(2)补码 - 正数符号位Sf =0,负数符号位Sf =1
- 正数数值不变,负数数值各位取反,末位加1
- “0”值形式唯一
例: X = +1010 则[X]补 = 0,1010 正数形式与原码一样
X = -1010 则[X]原 = 1,0101 + 0001= 1,0110
附加:* 已知一个补码,求其负值的补码,只需连同符号位一起,各位取反,末位加1 - 变形补码:符号位取两位,则其含义如下:
00表示正数、11表示负数、01表示正溢出、10表示负溢出
(3)反码 - 正数符号位Sf =0,负数符号位Sf =1
- 正数数值不变,负数数值各位取反
- “0”值形式不唯一
例: X = +1010 则[X]反 = 0,1010 正数形式与原码和补码一样
X = -1010 则[X]反 = 1,0101
(4)移码 - 正数符号位Sf =1,负数符号位Sf =0,与前三种码不同
- 正数数值不变,负数数值各位取反,末位加1,与补码相同
- “0”值形式唯一
例: X = +1010 则[X]反 = 1,1010
X = -1010 则[X]反 = 0,0101+ 0001= 0,0110 与补码就符号位不同
特点:直接从码的数值上,就可以判断出其真值的大小关系
二、浮点数表示
* 小数点的位置可以浮动,通过改变阶码值来实现
1、格式
数学意义: N = S × 2J,S用纯小数,表数的精度,J用纯整数,表数的范围
例:设上述浮点格式n为8位,m为6位,均用补码,把(-17.25)表示成浮点数。
则(-17.25)二进制数对应为(-10001.01),变成数学形式(-0.1000101×2101),其中除了阶底2为十进制数,其余皆为二进制,阶码为101(即十进制的5),尾数小数点左移了五位。
按上述格式补齐数位,尾数在数后补0,阶码在数前补0。
则上数变为(-0.10001010×2000101),尾数补码(1,01110110),阶码补码(0,000101)。
该数值整体表示成:0,000101;1,01110110。
2、表数范围(仅描述正数区间,负数只差符号)
|X|MAX=(1-2-n)×2K,其中K=2m-1
|X|MIN=(2-n)×2-K,其中K=2m-1
注意:此区间没包括0值
3、0值的浮点表示
- 理解尾数的真正意义,表示数值序列,只是没有小数点
- 理解阶码的真正意义,表示小数点的具体位置,正数在数值序列的后面(值变大),负数在数值序列的前面(值变小)
- 0值的表示:数值序列为0,且值变为最小(阶码为负值,且绝对值最大)
例:设上述浮点格式n为8位,m为6位,均用补码,表示0值。
则0值表示成,尾数(0,00000000) ,阶码(1,000000),阶码为负值,且绝对值最大。该0值整体表示成:1,000000;0,00000000。
注意:浮点0值若用补码表示则不是全0形式,硬件判断麻烦,所以有的机器数阶码用移码表示,尾数还用补码。
4、规格化
原因:保证有效数值尽可能最大化
形式:要求1>|S|≥(1/2),即尾数第一位S1=1
表数范围:|X|MIN=(2-1)×2-K,其中K=2m-1,|X|MAX同上
5、定点数与浮点数的比较
(1)字长一定时,定点表数精度高,浮点表数范围大;
(2)字长不同时(通常浮点表示字长要比定点表示长),浮点表数即精度高,又范围大;
(3)浮点运算比定点运算慢,浮点数是两部分,要分别处理;
(4)判断溢出时,定点数判断数值本身,浮点数判断阶码。
三、定点数的运算
1、移位运算
(1)逻辑移位:最高位不是符号位
规则:左移低位补0,右移高位补0
(2)算术移位:最高位为符号位,保持不变,仅对数值操作
规则:正数数值操作,左移低位补0,右移高位补0,不考虑码制
负数数值操作,原码时,左移低位补0,右移高位补0
反码时,左移低位补1,右移高位补1
补码时,左移低位补0,右移高位补1
(3)算术移位对结果的影响
正数数值操作时,不考虑码制,左移高位丢1,错误,右移低位丢1,误差
负数数值操作时,原码时,左移高位丢1,错误,右移低位丢1,误差
反码时,左移高位丢0,错误,右移低位丢0,误差
补码时,左移高位丢0,错误,右移低位丢1,误差
注意:负数的补码可以理解为原码和反码的组合体,左为反码,右为原码
2、加减法运算
- 仅描述补码规则,因为补码减法实际也是加操作,硬件简单,没有减法器
基本公式:[A]补+[B]补=[S]补 (mod M)
[A]补-[B]补=[A]补+[-B]补=[S]补 (mod M)
规则:加法直接加上加数的补码,减法加上负值加数的补码
注意:已知加数的补码,只需把其连同符号位一起,各位取反,末位加1,即为其负值加数的补码
溢出判断规则:同号相加,结果异号,则溢出 - 判断A0=B0且A0≠S0是否同时成立,成立即溢出
附加:
(1)一位加法器逻辑组成,某位运算对应关系如下:
Ai Bi Si(和值) Ci(对应的进位)
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
则上述对应的逻辑关系为:Si=Ai 异或Bi ,Ci=Ai 与Bi - 计算机其实是一种逻辑,不是真的计算,所有的运算均通过逻辑实现
对应的逻辑关系图如下(可有数字电路实现):
习惯上,在书上的讲解中把具体内容省略,再加上一个低位进位,抽象为下图:
(2)多位加法器的逻辑组成,下图以四位为例,1位为高位,4位为低位
(3)并行补码加法器逻辑组成,n+1位(n位数值,1位符号位)
Gs为减法标记,控制加数(当减法有效,X里各位取反,无效时,X里值不变)
3、乘法运算
(1)原码一位乘
- 手算的计算机仿真,运算时符号单处理,绝对值参与运算
- 计算机中数多为补码,所以运行时需码制转换
规则:根据乘数yi的数值来决定如何运算
当yi=0时,部分积加|x|,然后部分积右移一位
当yi=1时,部分积加0,然后部分积右移一位
例:[x]原=1.1110,[y]原=1.1101,求[xy]原
符号单处理,x0=1,y0=1,则积符=x0异或y0=0
运算时用绝对值,|x|=0.1110,|y|=0.1101,运算过程见下表
部分积z 乘数y 操作说明
0.0000
+0.1110 1101
加|x|
0.1110
0.0111
+0.0000
0 110
右移一位
加0
0.0111
0.0011
+0.1110
10 11
右移一位
加|x|
1.0001
0.1000
+0.1110
110 1
右移一位
加|x|
1.0110
0.1011
0110
右移一位
则[xy]原=0.10110110
小结:假设字长n位(不含符号位,上例n=4) - 部分积取n+1位,多的一位不是符号位,而是缓冲位,n位加法和可能为n+1位
- 乘数取n位,仅取数值字长,不含符号位
- 进行了n次加法,n次移位,加0也算一次
- 移位采用逻辑移位规则,部分积和乘数一起参与
- 计算过程中,若部分积最高位z0为1,不认为溢出,继续运算
(2)补码一位乘
- 补码运算过程中,补码直接参与运算,即符号位参与运算
布斯比较规则:根据乘数yi和附加的yi+1的数值来决定如何运算
当yi yi+1=00时,部分积加0,然后部分积右移一位
当yi yi+1=01时,部分积加[x]补,然后部分积右移一位
当yi yi+1=10时,部分积加[-x]补,然后部分积右移一位
当yi yi+1=11时,部分积加0,然后部分积右移一位
例:[x]补=0.0011,[y]补=1.0111,求[xy]补
计算时部分积取两位符号位,上述[x]补的相应数值如下:
[x]补=00.0011,符号位两位,11表示负数,00表示正数
[-x]补=11.1101,负值补码,连同符号位一起,各位取反,末位加1
运算过程见下表
部分积z 乘数y 附加yi+1 操作说明
00.0000
+11.1101 10111 0
加[-x]补
11.1101
11.1110
+00.0000
1 1011 1
右移一位
加0
11.1110
11.1111
+00.0000
01 101 1
右移一位
加0
11.1111
11.1111
+00.0011
101 10 1
右移一位
加[x]补
00.0010
00.0001
+11.1101
0101 1 0
右移一位
加[-x]补
11.1110 0101
则[xy]补=1.11100101
小结:假设字长n位(不含符号位,上例n=4) - 部分积取n+2位,多的两位一位是符号位,另一位是缓冲位,因补码运算符号参与运算,实际上是n+1位的加法,则和可能为n+2位
- 乘数取n+1位,符号参与运算,尾部再附加yi+1,初始yi+1为0
- 进行了n+1次加法,n次移位,最后一次只加不移位
- 移位采用补码算术移位规则,仅两位符号的最高位保持不变,即仅两位符号的最高位为真实的符号位,另一位符号位是缓冲位,部分积和乘数一起参与
- 运算的结果即为补码,不需要再转换
(3)补码一位乘法器的逻辑结构
译码器为2:4译码,控制门为与或门
4、除法运算
补码加减交替规则:符号参与运算
(1)初始操作,如果被除数[x]补与除数[y]补符号相同,上商0,执行[x]补-[y]补=[r]补
如果被除数[x]补与除数[y]补符号不同,上商1,执行[x]补+[y]补=[r]补
(2)后续操作,如果余数[r]补与除数[y]补同号,上商1,执行2[r]补-[y]补,生成新的[r]补
如果余数[r]补与除数[y]补异号,上商0,执行2[r]补+[y]补,生成新的[r]补
例:[x]补=1.0101,[y]补=0.1101,求[x/y]补
计算时余数取两位符号位,则[x]补的相应变为[x]补=11.0101,计算时需要[-y]补=11.0011
运算过程见下表
余数 商 操作说明
11.0101
+00.1101 0.0000 商初始值全0
[x]补与[y]补异号,+[y]补
00.0010
00.0100
+11.0011 1
1 [r]补与[y]补同号,商1
2[r]补,即左移一位
+[-y]补
11.0111
10.1110
+00.1101 10
10 [r]补与[y]补异号,商0
左移一位
+[y]补
11.1011
11.0110
+00.1101 100
100 [r]补与[y]补异号,商0
左移一位
+[y]补
00.0011
00.0110 1001
10011 [r]补与[y]补同号,商1
左移一位,末位恒1
[x/y]补=1.0011
小结:假设字长n位(不含符号位,上例n=4)
- 余数取n+2位,多的两位一位是符号位,另一位是缓冲位,因补码运算符号参与运算,实际上是n+1位的加法,则和可能为n+2位
- 商取n+1位,上商n+1次,第一次上商判断是否溢出,最后一次恒置1
- 进行了n次加法,n次移位
- 移位采用逻辑移位规则,最高位舍掉,低位补0
- 运算的结果即为补码,如首位符号和逻辑不符,则溢出
注意:仅乘法没有溢出,加、减、除均有溢出可能
四、浮点数的运算
1、浮点数的加减运算
设X = Sx× 2Jx,Y = Sy× 2Jy,计算X±Y
(1)对阶:对齐两数的阶码
- 原则是小阶向大阶对齐
(2)尾数求和:对齐阶码后,计算Sx±Sy
(3)规格化 - 习惯上符号取两位
- 判断形势(补码规则):00.1﹡﹡﹡或11.0﹡﹡﹡
- 左规:当尾数为00.0﹡﹡﹡或11.1﹡﹡﹡时,左移尾数,直至符号位与小数点后第一位互异为止
- 右规:当尾数为01.﹡﹡﹡或10.﹡﹡﹡时,右移尾数,只需一次
注意:左规和右规二者只需做一种,判断时,先看是否右规,再看是否左规
(4)舍入处理 - 0舍1入:丢掉的数值最高位如为1,保留的数值末位加1,否则加0
- 末位恒1:保留的数值末位置1(注意不是加1)
例:设X =0.1101×201,Y =-0.1010×211,其中除了阶底2为十进制数,其余皆为二进制,计算X+Y,字长格式(2+3;2+6),均采用补码。
则 [X]补=00,001;00.110100
[Y]补=00,011;11.011000
对阶 阶差=[Jx]补+[-Jy]补=00,001+11,101=11,110﹤0
对X的阶码,[X]补变为00,011;00.001101
尾和 和的尾数=[Sx]补+[Sy]补=00.001101+11.011000=11.100101
[X+Y]补=00,011;11.100101 - 对阶之后的阶码,求尾数和之后的尾数和
规格化 上述结果尾数形式判断,不需右规,需要左规(仅需一位即可)
[X+Y]补变为00,010;11.001010 //尾数左移一位,阶码减1
判断溢出 阶码没有溢出,上述值为结果
2、浮点数的乘除运算
运算步骤:(1)阶码相加减
(2)尾数相乘除
(3)规格化
(4)判断溢出
结论:浮点运算其实是通过定点运算完成的
五、面向错误检测与纠错的数据编码
*编码最小距离:某种编码系统中,任意两个相邻码之间最少的二进制不同位数(用L表示)
*纠错理论: L-1=D+C 且 D≥C (其中D代表检测错码个数、C代表纠正错码个数)
1、奇偶校验码
*正常编码码距L均为1,套用上述纠错理论公式,结果是既不能检错,也不能纠错
*要想检错只能增加码距,奇偶校验码附加一位,下表在码末位附加一位,码距L变为2
十进制数 自然BCD码(NBCD) 奇校验码 偶校验码
0
1
2
3
4
5
6
7
8
9 0000
0001
0010
0011
0100
0101
0110
0111
1000
1001 00001
00010
00100
00111
01000
01011
01101
01110
10000
10011 00000
00011
00101
00110
01001
01010
01100
01111
10001
10010
特点:(1)原理简单,宜于实现。
(2)只能检错,不能纠错,即知道有数位出错了,具体是哪一位不能确定。处理的方法只能是重新处理一遍。
2、海明码(Hamming)
- 附加多位,使码距大于2,则D和C均可大于1,即可检错又可纠错
- 实际上是奇偶校验码的扩展,内部是多组奇偶校验码
- 附加数位K和原编码尾数N之间应满足:2K≥N+K+1,具体对应数值见下表
N K(最小)
1 2
2-4 3
5-11 4
12-26 5
其余数值套用公式可以得到
例如,N=4时(分别记为b4b3b2b1),需附加K=3(分别记为C4C2C1),具体位置安排如下:
二进制序号 1 2 3 4 5 6 7
名称 C1 C2 b4 C4 b3 b2 b1
- 因为附加三位,实际上内部包含三组
- 分组特点
(1)每个小组有一位且仅有一位为它独有数位
(2)每两个小组共同占有一位其他小组没有的数位
(3)每三个小组共同占有一位其他小组没有的数位
如果附加位数越多,内部分组越多,分组特点按上述类推,上例具体分组如下:
C1对应第一组,相应数位为1、3、5、7
C2对应第二组,相应数位为2、3、6、7
C4对应第三组,相应数位为4、5、6、7 //满足上述分组特点
组码 当b4b3b2b1=1100,按上述分组分别计算,则
C1=b4⊕b3⊕b1=1⊕1⊕0=0
C2=b4⊕b2⊕b1=1⊕0⊕0=1
C4=b3⊕b2⊕b1=1⊕0⊕0=1
所以,按上表位置排列,相应的海明码为0111100
校验 假设正确的海明码(0111100)有一位出错,变为(0111000),按分组校验
P1=1⊕3⊕5⊕7=0⊕1⊕0⊕0=1 //1、3、5、7指代对应的数位
P2=2⊕3⊕6⊕7=1⊕1⊕0⊕0=0
P4=4⊕5⊕6⊕7=1⊕0⊕0⊕0=1
把上述结果组成二进制数,P4 P2 P1=101B,对应十进制数为5,即第5位出错,如无错,则P4 P2 P1=000B,不指代任何数位。
注意:海明码仅能纠正一位出错,如多于一位出错,则海明码无法处理第六章 计算机中数的表示和计算
一、定点数表示
-
小数点位置固定,放在字首称小数定点,放在字尾称整数定点
-
定点表示机器只能表示纯的整数或纯的小数,不能表示实数
1、无符号数:最高位不是符号位
(1)整数定点:小数点放在字尾
例:以8位二进制为例,格式如下:0 0 0 0 0 0 0 0 真值为0 0 0 0 0 0 0 0 1 真值为1 … 1 1 1 1 1 1 1 1 真值为28-1=255
(2)小数定点:小数点放在字首
例:以8位二进制为例,格式如下:
0.0 0 0 0 0 0 0 0 真值为0
0.0 0 0 0 0 0 0 1 真值为2-8
…
0.1 1 1 1 1 1 1 1 真值为1-2-8
2、有符号数:最高位是符号位,有效数值相应少一位
(1)整数定点:小数点放在字尾,最高位为符号位Sf
(2)小数定点:最高位为符号位Sf,小数点放在Sf之后
3、有符号数的码制
(1)原码
- 数值不变,正数符号位Sf =0,负数符号位Sf =1,“0”值形式不唯一
例: X = +1010 则[X]原 = 0,1010
X = -1010 则[X]原 = 1,1010
(2)补码 - 正数符号位Sf =0,负数符号位Sf =1
- 正数数值不变,负数数值各位取反,末位加1
- “0”值形式唯一
例: X = +1010 则[X]补 = 0,1010 正数形式与原码一样
X = -1010 则[X]原 = 1,0101 + 0001= 1,0110
附加:* 已知一个补码,求其负值的补码,只需连同符号位一起,各位取反,末位加1 - 变形补码:符号位取两位,则其含义如下:
00表示正数、11表示负数、01表示正溢出、10表示负溢出
(3)反码 - 正数符号位Sf =0,负数符号位Sf =1
- 正数数值不变,负数数值各位取反
- “0”值形式不唯一
例: X = +1010 则[X]反 = 0,1010 正数形式与原码和补码一样
X = -1010 则[X]反 = 1,0101
(4)移码 - 正数符号位Sf =1,负数符号位Sf =0,与前三种码不同
- 正数数值不变,负数数值各位取反,末位加1,与补码相同
- “0”值形式唯一
例: X = +1010 则[X]反 = 1,1010
X = -1010 则[X]反 = 0,0101+ 0001= 0,0110 与补码就符号位不同
特点:直接从码的数值上,就可以判断出其真值的大小关系
二、浮点数表示
* 小数点的位置可以浮动,通过改变阶码值来实现
1、格式
数学意义: N = S × 2J,S用纯小数,表数的精度,J用纯整数,表数的范围
例:设上述浮点格式n为8位,m为6位,均用补码,把(-17.25)表示成浮点数。
则(-17.25)二进制数对应为(-10001.01),变成数学形式(-0.1000101×2101),其中除了阶底2为十进制数,其余皆为二进制,阶码为101(即十进制的5),尾数小数点左移了五位。
按上述格式补齐数位,尾数在数后补0,阶码在数前补0。
则上数变为(-0.10001010×2000101),尾数补码(1,01110110),阶码补码(0,000101)。
该数值整体表示成:0,000101;1,01110110。
2、表数范围(仅描述正数区间,负数只差符号)
|X|MAX=(1-2-n)×2K,其中K=2m-1
|X|MIN=(2-n)×2-K,其中K=2m-1
注意:此区间没包括0值
3、0值的浮点表示
- 理解尾数的真正意义,表示数值序列,只是没有小数点
- 理解阶码的真正意义,表示小数点的具体位置,正数在数值序列的后面(值变大),负数在数值序列的前面(值变小)
- 0值的表示:数值序列为0,且值变为最小(阶码为负值,且绝对值最大)
例:设上述浮点格式n为8位,m为6位,均用补码,表示0值。
则0值表示成,尾数(0,00000000) ,阶码(1,000000),阶码为负值,且绝对值最大。该0值整体表示成:1,000000;0,00000000。
注意:浮点0值若用补码表示则不是全0形式,硬件判断麻烦,所以有的机器数阶码用移码表示,尾数还用补码。
4、规格化
原因:保证有效数值尽可能最大化
形式:要求1>|S|≥(1/2),即尾数第一位S1=1
表数范围:|X|MIN=(2-1)×2-K,其中K=2m-1,|X|MAX同上
5、定点数与浮点数的比较
(1)字长一定时,定点表数精度高,浮点表数范围大;
(2)字长不同时(通常浮点表示字长要比定点表示长),浮点表数即精度高,又范围大;
(3)浮点运算比定点运算慢,浮点数是两部分,要分别处理;
(4)判断溢出时,定点数判断数值本身,浮点数判断阶码。
三、定点数的运算
1、移位运算
(1)逻辑移位:最高位不是符号位
规则:左移低位补0,右移高位补0
(2)算术移位:最高位为符号位,保持不变,仅对数值操作
规则:正数数值操作,左移低位补0,右移高位补0,不考虑码制
负数数值操作,原码时,左移低位补0,右移高位补0
反码时,左移低位补1,右移高位补1
补码时,左移低位补0,右移高位补1
(3)算术移位对结果的影响
正数数值操作时,不考虑码制,左移高位丢1,错误,右移低位丢1,误差
负数数值操作时,原码时,左移高位丢1,错误,右移低位丢1,误差
反码时,左移高位丢0,错误,右移低位丢0,误差
补码时,左移高位丢0,错误,右移低位丢1,误差
注意:负数的补码可以理解为原码和反码的组合体,左为反码,右为原码
2、加减法运算
- 仅描述补码规则,因为补码减法实际也是加操作,硬件简单,没有减法器
基本公式:[A]补+[B]补=[S]补 (mod M)
[A]补-[B]补=[A]补+[-B]补=[S]补 (mod M)
规则:加法直接加上加数的补码,减法加上负值加数的补码
注意:已知加数的补码,只需把其连同符号位一起,各位取反,末位加1,即为其负值加数的补码
溢出判断规则:同号相加,结果异号,则溢出 - 判断A0=B0且A0≠S0是否同时成立,成立即溢出
附加:
(1)一位加法器逻辑组成,某位运算对应关系如下:
Ai Bi Si(和值) Ci(对应的进位)
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
则上述对应的逻辑关系为:Si=Ai 异或Bi ,Ci=Ai 与Bi - 计算机其实是一种逻辑,不是真的计算,所有的运算均通过逻辑实现
对应的逻辑关系图如下(可有数字电路实现):
习惯上,在书上的讲解中把具体内容省略,再加上一个低位进位,抽象为下图:
(2)多位加法器的逻辑组成,下图以四位为例,1位为高位,4位为低位
(3)并行补码加法器逻辑组成,n+1位(n位数值,1位符号位)
Gs为减法标记,控制加数(当减法有效,X里各位取反,无效时,X里值不变)
3、乘法运算
(1)原码一位乘
- 手算的计算机仿真,运算时符号单处理,绝对值参与运算
- 计算机中数多为补码,所以运行时需码制转换
规则:根据乘数yi的数值来决定如何运算
当yi=0时,部分积加|x|,然后部分积右移一位
当yi=1时,部分积加0,然后部分积右移一位
例:[x]原=1.1110,[y]原=1.1101,求[xy]原
符号单处理,x0=1,y0=1,则积符=x0异或y0=0
运算时用绝对值,|x|=0.1110,|y|=0.1101,运算过程见下表
部分积z 乘数y 操作说明
0.0000
+0.1110 1101
加|x|
0.1110
0.0111
+0.0000
0 110
右移一位
加0
0.0111
0.0011
+0.1110
10 11
右移一位
加|x|
1.0001
0.1000
+0.1110
110 1
右移一位
加|x|
1.0110
0.1011
0110
右移一位
则[xy]原=0.10110110
小结:假设字长n位(不含符号位,上例n=4) - 部分积取n+1位,多的一位不是符号位,而是缓冲位,n位加法和可能为n+1位
- 乘数取n位,仅取数值字长,不含符号位
- 进行了n次加法,n次移位,加0也算一次
- 移位采用逻辑移位规则,部分积和乘数一起参与
- 计算过程中,若部分积最高位z0为1,不认为溢出,继续运算
(2)补码一位乘
- 补码运算过程中,补码直接参与运算,即符号位参与运算
布斯比较规则:根据乘数yi和附加的yi+1的数值来决定如何运算
当yi yi+1=00时,部分积加0,然后部分积右移一位
当yi yi+1=01时,部分积加[x]补,然后部分积右移一位
当yi yi+1=10时,部分积加[-x]补,然后部分积右移一位
当yi yi+1=11时,部分积加0,然后部分积右移一位
例:[x]补=0.0011,[y]补=1.0111,求[xy]补
计算时部分积取两位符号位,上述[x]补的相应数值如下:
[x]补=00.0011,符号位两位,11表示负数,00表示正数
[-x]补=11.1101,负值补码,连同符号位一起,各位取反,末位加1
运算过程见下表
部分积z 乘数y 附加yi+1 操作说明
00.0000
+11.1101 10111 0
加[-x]补
11.1101
11.1110
+00.0000
1 1011 1
右移一位
加0
11.1110
11.1111
+00.0000
01 101 1
右移一位
加0
11.1111
11.1111
+00.0011
101 10 1
右移一位
加[x]补
00.0010
00.0001
+11.1101
0101 1 0
右移一位
加[-x]补
11.1110 0101
则[xy]补=1.11100101
小结:假设字长n位(不含符号位,上例n=4) - 部分积取n+2位,多的两位一位是符号位,另一位是缓冲位,因补码运算符号参与运算,实际上是n+1位的加法,则和可能为n+2位
- 乘数取n+1位,符号参与运算,尾部再附加yi+1,初始yi+1为0
- 进行了n+1次加法,n次移位,最后一次只加不移位
- 移位采用补码算术移位规则,仅两位符号的最高位保持不变,即仅两位符号的最高位为真实的符号位,另一位符号位是缓冲位,部分积和乘数一起参与
- 运算的结果即为补码,不需要再转换
(3)补码一位乘法器的逻辑结构
译码器为2:4译码,控制门为与或门
4、除法运算
补码加减交替规则:符号参与运算
(1)初始操作,如果被除数[x]补与除数[y]补符号相同,上商0,执行[x]补-[y]补=[r]补
如果被除数[x]补与除数[y]补符号不同,上商1,执行[x]补+[y]补=[r]补
(2)后续操作,如果余数[r]补与除数[y]补同号,上商1,执行2[r]补-[y]补,生成新的[r]补
如果余数[r]补与除数[y]补异号,上商0,执行2[r]补+[y]补,生成新的[r]补
例:[x]补=1.0101,[y]补=0.1101,求[x/y]补
计算时余数取两位符号位,则[x]补的相应变为[x]补=11.0101,计算时需要[-y]补=11.0011
运算过程见下表
余数 商 操作说明
11.0101
+00.1101 0.0000 商初始值全0
[x]补与[y]补异号,+[y]补
00.0010
00.0100
+11.0011 1
1 [r]补与[y]补同号,商1
2[r]补,即左移一位
+[-y]补
11.0111
10.1110
+00.1101 10
10 [r]补与[y]补异号,商0
左移一位
+[y]补
11.1011
11.0110
+00.1101 100
100 [r]补与[y]补异号,商0
左移一位
+[y]补
00.0011
00.0110 1001
10011 [r]补与[y]补同号,商1
左移一位,末位恒1
[x/y]补=1.0011
小结:假设字长n位(不含符号位,上例n=4)
- 余数取n+2位,多的两位一位是符号位,另一位是缓冲位,因补码运算符号参与运算,实际上是n+1位的加法,则和可能为n+2位
- 商取n+1位,上商n+1次,第一次上商判断是否溢出,最后一次恒置1
- 进行了n次加法,n次移位
- 移位采用逻辑移位规则,最高位舍掉,低位补0
- 运算的结果即为补码,如首位符号和逻辑不符,则溢出
注意:仅乘法没有溢出,加、减、除均有溢出可能
四、浮点数的运算
1、浮点数的加减运算
设X = Sx× 2Jx,Y = Sy× 2Jy,计算X±Y
(1)对阶:对齐两数的阶码
- 原则是小阶向大阶对齐
(2)尾数求和:对齐阶码后,计算Sx±Sy
(3)规格化 - 习惯上符号取两位
- 判断形势(补码规则):00.1﹡﹡﹡或11.0﹡﹡﹡
- 左规:当尾数为00.0﹡﹡﹡或11.1﹡﹡﹡时,左移尾数,直至符号位与小数点后第一位互异为止
- 右规:当尾数为01.﹡﹡﹡或10.﹡﹡﹡时,右移尾数,只需一次
注意:左规和右规二者只需做一种,判断时,先看是否右规,再看是否左规
(4)舍入处理 - 0舍1入:丢掉的数值最高位如为1,保留的数值末位加1,否则加0
- 末位恒1:保留的数值末位置1(注意不是加1)
例:设X =0.1101×201,Y =-0.1010×211,其中除了阶底2为十进制数,其余皆为二进制,计算X+Y,字长格式(2+3;2+6),均采用补码。
则 [X]补=00,001;00.110100
[Y]补=00,011;11.011000
对阶 阶差=[Jx]补+[-Jy]补=00,001+11,101=11,110﹤0
对X的阶码,[X]补变为00,011;00.001101
尾和 和的尾数=[Sx]补+[Sy]补=00.001101+11.011000=11.100101
[X+Y]补=00,011;11.100101 - 对阶之后的阶码,求尾数和之后的尾数和
规格化 上述结果尾数形式判断,不需右规,需要左规(仅需一位即可)
[X+Y]补变为00,010;11.001010 //尾数左移一位,阶码减1
判断溢出 阶码没有溢出,上述值为结果
2、浮点数的乘除运算
运算步骤:(1)阶码相加减
(2)尾数相乘除
(3)规格化
(4)判断溢出
结论:浮点运算其实是通过定点运算完成的
五、面向错误检测与纠错的数据编码
*编码最小距离:某种编码系统中,任意两个相邻码之间最少的二进制不同位数(用L表示)
*纠错理论: L-1=D+C 且 D≥C (其中D代表检测错码个数、C代表纠正错码个数)
1、奇偶校验码
*正常编码码距L均为1,套用上述纠错理论公式,结果是既不能检错,也不能纠错
*要想检错只能增加码距,奇偶校验码附加一位,下表在码末位附加一位,码距L变为2
十进制数 自然BCD码(NBCD) 奇校验码 偶校验码
0
1
2
3
4
5
6
7
8
9 0000
0001
0010
0011
0100
0101
0110
0111
1000
1001 00001
00010
00100
00111
01000
01011
01101
01110
10000
10011 00000
00011
00101
00110
01001
01010
01100
01111
10001
10010
特点:(1)原理简单,宜于实现。
(2)只能检错,不能纠错,即知道有数位出错了,具体是哪一位不能确定。处理的方法只能是重新处理一遍。
2、海明码(Hamming)
- 附加多位,使码距大于2,则D和C均可大于1,即可检错又可纠错
- 实际上是奇偶校验码的扩展,内部是多组奇偶校验码
- 附加数位K和原编码尾数N之间应满足:2K≥N+K+1,具体对应数值见下表
N K(最小)
1 2
2-4 3
5-11 4
12-26 5
其余数值套用公式可以得到
例如,N=4时(分别记为b4b3b2b1),需附加K=3(分别记为C4C2C1),具体位置安排如下:
二进制序号 1 2 3 4 5 6 7
名称 C1 C2 b4 C4 b3 b2 b1
- 因为附加三位,实际上内部包含三组
- 分组特点
(1)每个小组有一位且仅有一位为它独有数位
(2)每两个小组共同占有一位其他小组没有的数位
(3)每三个小组共同占有一位其他小组没有的数位
如果附加位数越多,内部分组越多,分组特点按上述类推,上例具体分组如下:
C1对应第一组,相应数位为1、3、5、7
C2对应第二组,相应数位为2、3、6、7
C4对应第三组,相应数位为4、5、6、7 //满足上述分组特点
组码 当b4b3b2b1=1100,按上述分组分别计算,则
C1=b4⊕b3⊕b1=1⊕1⊕0=0
C2=b4⊕b2⊕b1=1⊕0⊕0=1
C4=b3⊕b2⊕b1=1⊕0⊕0=1
所以,按上表位置排列,相应的海明码为0111100
校验 假设正确的海明码(0111100)有一位出错,变为(0111000),按分组校验
P1=1⊕3⊕5⊕7=0⊕1⊕0⊕0=1 //1、3、5、7指代对应的数位
P2=2⊕3⊕6⊕7=1⊕1⊕0⊕0=0
P4=4⊕5⊕6⊕7=1⊕0⊕0⊕0=1
把上述结果组成二进制数,P4 P2 P1=101B,对应十进制数为5,即第5位出错,如无错,则P4 P2 P1=000B,不指代任何数位。
注意:海明码仅能纠正一位出错,如多于一位出错,则海明码无法处理第