浮点数加/减运算时,在尾数相加/减之前所进行的操作称为对阶。对阶时,需要比较两个阶的大小。阶小的那个数的尾数右移,阶码增量。右移一次,阶码加1,直到两数的阶码相等为止。
溢出是指一个数比给定的格式所能表示的最大值还要大,或比最小值还要小的现象。因为无符号数、有符号定点数和有符号浮点数的位数是有限的,所以,都有可能发生溢出,但判断溢出的具体方法不同。
在浮点数运算中,当一个浮点数的指数比最小允许值还小,此时,浮点数发生下溢。一般机器把下溢时的值置为0。此时,不发生溢出故障。
在浮点数运算中,当一个浮点数的指数超过了最大允许值,此时,浮点数发生上溢(即:向∞方向溢出)。如果结果是正数,则发生正上溢(有的机器把值置为+∞);如果是负数,则发生负上溢(有的机器把值置为-∞)。这种情况为软件故障,通常要引入溢出故障处理程序来处理。
为了使数据有效位在右移时最大限度地保证不丢失,一般在运算中间值后面增加若干数据位,这些位用来保存右移后的有效数据,称为保护位。增设保护位后,能保证运行的中间结果的有效位数,但最终必须将结果的保护位去掉,以得到规定格式的浮点数,此时要考虑舍入。在IEEE754标准中规定,所有浮点运算的中间结果都必须额外多保留两位,这两位分别称为保护位和舍入位。
为了使浮点数中能尽量多地表示有效位数,一般要求运算结果用规格化数形式表示。规格化浮点数的尾数小数点后的第一位一定是个非零数。因此,对于原码编码的尾数来说,只要看尾数的第一位是否为1就行;对于补码表示的尾数,只要看符号位和尾数最高位是否相反。
在浮点数运算中,当一个尾数的数值部分的高位出现0时,尾数为非规格化形式。此时,进行“左规”操作:尾数左移一位,阶码减1,直到尾数为规格化形式为止。
在浮点数运算中,当尾数最高有效位有进位时,发生尾数溢出。此时,进行“右规”操作:尾数右移一位,阶码加1,直到尾数为规格化形式为止。右规过程中,要判断是否发生溢出。此时,只要阶码不发生上溢,则浮点数不会溢出。
舍入是指数值数据右部的低位数据需要丢弃时,为保证丢弃后数值误差尽量小而考虑的一种操作。例如,定点整数“右移”时、浮点加/减运算中某数“对阶”时、浮点运算结果“右规”时都会涉及到舍入。
逻辑移位是对无符号数进行的移位,把无符号数看成一个逻辑数进行移位操作。左移时,高位移出,低位补0;右移时,低位移出,高位补0。
算术移位是对带符号数进行的,移位前后符号位不变。左移一位,数值扩大一倍,相当于乘2操作;右移一位,数值缩小一半,相当于除2操作。移位时,符号位不动,只是数值部分进行移位。对于不同的编码,其移位规则不同。
① 原码
左移:高位移出,末位补0。移出非零时,发生溢出。
右移:高位补0,低位移出。移出时进行舍入操作。
② 补码
左移:高位移出,末位补0。移出非符时,发生溢出。
右移:高位补符,低位移出。移出时进行舍入操作。
循环移位是一种逻辑移位,移位时把高(低)位移出的一位送到低(高)位,即:左移时,各位左移一位,并把最左边的位移到最右边;右移时,各位右移一位,并把最右边的位移到最左边。
具有移位功能的寄存器,称为移位寄存器。
在计算机内部,有时需要将一个取来的短数扩展为一个长数,此时要进行填充(扩展)处理。有“零扩展”和“符号扩展”两种。
对无符号整数进行高位补0的操作称为“零扩展”。
对补码整数在高位直接补符的操作,称为“符号扩展”。
进行扩展(填充)操作的部件,称为扩展器。一般输入为n位,输出为2n位。
只考虑本位两个加数而不考虑低位进位来生成本位和的一位加法器。
不仅考虑本位两个加数而且考虑低位进位来生成本位和的一位加法器。
能进行n位加法运算的部件。
在进行n位加法运算时,低位向高位的进位采用像“行波”一样进行串行传递的方式,称为行波进位方式。
行波进位加法器也称为串行进位加法器,它通过n个全加器按照串行方式连起来实现。进位方式采用行波进位方式。
通过引入两个进位辅助函数(进位生成和进位传递),使得加法器的各个进位之间相互独立、并行产生。这种进位方式也称为并行进位方式。
n位加法器中,每一位定义一个函数:gi = Ai &Bi (“&”表示与操作)。该函数的含义是,只要函数值gi为1,不管低位有没有进位,一定能生成向高位的进位。这个函数称为进位生成函数。
n位加法器中,每一位定义一个函数:pi = Ai | Bi ( “|” 表示或操作),该函数的含义是,只要函数值pi为1,那么,低位来的进位一定能传递到高位。这个函数称为进位传递函数。
先行进位加法器也称为并行进位加法器,它通过引入进位生成函数和进位传递函数,使得进位之间相互独立、并行产生。因而能够快速得到最终整个和数。故也称为快速加法器。
用来执行各种算术和逻辑运算的部件。有两个源输入端和一个结果输出端,并具有操作控制和低位进位输入端,以及输出结果是否为0等标志输出端。
是一种补码乘法算法,用于带符号数的乘法运算,由Booth提出。算法的基本思想是在乘数的末位添加一个“0”,乘数中出现的连续“0”和连续“1”处不进行任何运算;出现“10”时,做减法;出现“01”时,做加法。每次只做一位乘法,因而每一步都右移一位。