5.1 有符号数
5.1.1 原码表示法
原码是机器数中最简单的一种表示形式,符号位为0表示正数,符号位为1表示负数,数值位即为真值的绝对值,故原码表示又称为带符号的绝对值表示。
整数原码定义
[x]_原=\left{\begin{matrix} 0,x& 2^n>x>0& \ 2^n-x,& 0\ge x>-2^n & \end{matrix}\right.
式中,x为真值,n为整数的位数。
小数原码定义
[x]_原=\left{\begin{matrix} x,& 1>x \ge 0& \ 1-x,& 0\ge x>-1 & \end{matrix}\right.
当x为0时,[+0.0000]原=0.0000,[−0.0000]原=1.0000 可见原码中的“零”有两种表示形式。
5.1.2 补码表示法
补数的概念
只要确定了“模”,就可找到一个与负数灯架的整数来代替此负数,这样就可把减法运算用加法实现。
- 一个负数可用它的正补数来代替,而这个正补数可以用模加上负数本身求得。
- 一个正数和一个负数互为补数时,它们绝对值之和即为模数。
- 正数的补数即该正数本身。
整数补码定义
[x]_补=\left{\begin{matrix} 0,x& 2^n>x \ge 0& \ 2^{n+1}+x,& 0> x \ge -2^n (mod\;2^{n+1}) & \end{matrix}\right.
小数补码定义
[x]_补=\left{\begin{matrix} x& 1>x \ge 0& \ 2+x,& 0>x \ge -1(mod\;2^{n+1}) & \end{matrix}\right.
当x为0时,[+0]补=[−0]补=0.0000,即补码中的“零”只有一种表示形式。由于补码中的零只有一种表示形式,故它比原码能多表示一个“-1”。
当模数为4时,形成双符号位的补码。这种双符号位的补码又称为变形补码,它在阶码运算和溢出判断中有其特殊作用。如x=-0.1001,对mod 22而言,
对于负数,由[x]补求[x]原和由[x]原求[x]补都可用规则除符号位外,每位求反,末尾加一。
论真值是正还是负,由[x]补求[−x]补求都是采用规则连同符号位在内,每位取反,末尾加一。
5.1.3 反码表示法
反码同行用来作为由原码求补码或者由补码求原码的中间过渡。
整数反码定义
[x]_反=\left{\begin{matrix} 0,x& 2^n>x \ge 0& \ (2^{n+1}-1)+x,& 0 \ge x > -2^n (mod\;(2^{n+1}-1)) & \end{matrix}\right.
小数反码定义
[x]_反=\left{\begin{matrix} x& 1>x \ge 0& \ (2-2^{-n})+x,& 0 \ge x > -1(mod\;(2-2^{-n})) & \end{matrix}\right.
当x为0时,[+0.0000]反=0.0000 [−0.0000]反=(10.0000−0.0001)−0.0000=1.1111 可见[+0]反不等于[−0]反,反码中的“零”有两种表示形式。
实际上,反码也可看作是mod(2−2−n)(对于小数)或mod(2n+1−1)(对于整数)的补码。与补码相比,仅在末尾差1,故也称小数的补码为2的补码,小数的反码为1的补码。
对于负数,由[x]反求[x]原和由[x]原求[x]反都可用规则除符号位外,每位求反。
三种机器数的特点可归纳如下:
- 三种机器数的最高位均为符号位。符号位和数值部分之间可用“.”(对于小数)或“,”(对于整数)隔开
- 当真值为正时,原码、补码和反码的表示形式均相同,即符号位用“0”表示,数值部分与真值相同。
- 当真值为负时,原码、补码和反码的表示形式不同,但其符号位用“1”表示,而数值部分有这样的关系:补码是原码的“求反加一”,反码是原码的“每位求反”。
5.1.4 移码表示法
移码定义
[x]移=2n+x(2n>x≥-2n)
其实移码就是在真值上加一个常数2n。在数轴上移码所表示的范围恰好对应于真值在数轴上的范围向轴的正方向移动2n个单元,故称为移码。
当x为0时,[+0]移=[−0]移=1.0000,即移码中的“零”只有一种表示形式,故它比原码能多表示一个负数。
移码的最小真值为全0。利用移码的这一特点,当浮点数的阶码用移码表示时,就能很方便地判断阶码的大小。
同一个真值的移码和补码仅差一个符号位,若将补码的符号位由“0”改为“1”或从“1”改为“0”,即可得该真值的移码。
5.2 数的定点表示和浮点表示
共有两种方法表示小数点的存在,即定点表示和浮点表示。定点表示的数称为定点数,浮点表示的数称为浮点数。
5.2.1 定点表示
小数点在某一位置的数为定点数,有以下两种格式。
当小数点位于数符和第一数值位之间时,机器内的数为纯小数;当小数点位于数值位之后时,机器内的数为纯整数。采用定点数的机器称为定点机。数值部分的位数n决定了定点机中数的表示范围。若机器数采用原码,小数定点机中的数的表示范围是−(1−2−n)(1−2−n),整数定点机中数的表示范围是−(2n−1)(2n−1)。 在定点机中,由于小数点的位置固定不定,故当机器处理的数不是纯小数或纯整数时,必须乘上一个比例因子,否则会产生“溢出”。
5.2.2 浮点表示
浮点数即小数点的位置可以浮动的数。
通常浮点数被表示成
N=S×rj
式中,S为尾数,j为阶码,r是基数。在计算机中,基数可取2、4、8、16等。 为了提高数据精度以及便于浮点数的比较,在计算机中规定浮点数的尾数用纯小数形式。将尾数最高位为1的浮点数称为 规格化数。浮点数表示成规格化形式后,其精度最高。
5.2.3 浮点数的表示形式
采用这种数据格式的机器称为浮点机。
浮点数由阶码j和尾数S两部分组成。阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位置;尾数是小数,其位数n反映了浮点数的精度;尾数的符号Sf代表浮点数的正负。
5.2.4 浮点数的表示范围
设浮点数阶码的数值位取m位,尾数的数值位取n位,当浮点数为非规格化数时,它在数轴上的表示范围如下。
最大正数为22m−1×(1−2−n);最小正数为2(-2m−1)×2−n;最大负数为−2(-2m−1)×2−n;最小负数为−22m−1×(1−2−n)。
当浮点数阶码大于最大阶码时,称为上溢,此时机器停止运算,进行中断溢出处理;当浮点数阶码小于最小阶码时,称为下溢,此时溢出的数绝对值很小,通常将尾数各位强置为0,按机器零处理,此时机器可以继续运行。
一旦浮点数的位数确定后,合理分配阶码和尾数的位数,直接影响浮点数的表示范围和精度。对于短实数(总位数为32位),阶码取8位(含阶符1位),尾数取24位(含数符1位);对于长实数(总位数为64位),阶码取11位(含阶符1位),尾数取53位(含数符1位);对于临时实数(总位数为80位),阶码取15位(含阶符1位),尾数取65位(含数符1位)。
当一个浮点数尾数为0时,不论其阶码为何值;或阶码等于或小于它所能表示的最小数时,不管其尾数为何值,机器都把该浮点数作为零看待,并称之为机器零。如果浮点数的阶码用移码表示,尾数用补码表示,则当阶码为它所能表示的最小数2−m且尾数为0时,其阶码(移码)全为0,尾数(补码)也全为0,这样的机器零为000…00000,全零表示有利于简化机器中判“0”电路。
5.2.4 浮点数的规格化
将非规格化数转换成规格化数的过程称为规格化。对于技术不同的浮点数,因其规格化数的形式不同,规格化过程也不同。
- 当基数为2时,尾数最高位为1的数为规格化数。规格化时,尾数左移一位,阶码减1(称为左规);尾数右移一位,阶码加1(称为右规)。
- 当基数为4时,尾数最高两位不全为零的数为规格化数。规格化时,尾数左移两位,阶码减1;尾数右移两位,阶码加1。
- 当基数为8时,尾数最高三位不全为零的数为规格化数。规格化时,尾数左移三位,阶码减1;尾数右移三位,阶码加1。
一般来说,基数r越大,可表示的浮点数范围越大,而且所表示的数的个数也越多。但r越多,浮点数的精度反而下降。
5.3 定点数和浮点数的比较
- 当浮点机和定点机中数的位数相同时,浮点数的表示范围比定点数大得多。
- 当浮点数为规格化数时,其相对精度远比定点数高。
- 浮点数运算要分阶码部分和尾数部分,而且运算结果都要求规格化,故浮点运算步骤比定点运算步骤多,运算速度比定点运算的低,运算线路比定点运算的复杂。
- 在溢出的判断方法上,浮点数是对规格化数的阶码进行判断,而定点数是对数值本身进行判断。
浮点数在数的表示范围、数的精度、溢出处理和程序编程方面(不取比例因子)均优于定点数。到哪在运算规则、运算速度及硬件成本方面又不如定点数。
5.4 IEEE 754标准
浮点数一般采用IEEE指定的国际标准,这种标注形式如下。
按IEEE标准,常用的浮点数有三种:
阶码用移码表示,阶码的真值都被加上一个常数(偏移量),如短实数、长实数、临时实数的偏移量用十六进制数表示分别为7FH、3FFH、3FFFH。尾数部分通常都是规格化表示,即非“0”的有效位最高位总是“1”,但在IEEE标准中,有效位呈如下形式。
1♠ffff……fff
其中 ♠表示假想的二进制小数点。在实际表示中,对短实数和长实数,这个整数位的1省略,称 隐藏位;对于临时实数不采用隐藏位方案。
5.5 定点运算
5.5.1 移位运算
移位的意义
二进制表示的机器数在相对于小数点作n位左移或右移时,其实质就是该数乘以或除以2n。当某计算机没有乘除法运算线路时,可以采用移位和加法相结合,实现乘除运算。
计算机中机器数的字长往往是固定的,当机器数左移n位或右移n位时,必然会使其n位低位或n位高位出现空位。对有符号数的移位称为算数移位。
算数移位的规则
对于正数,由于[x]原=[x]补=[x]反=真值,故移位后出现的空位均以0添之。对于负数,由于原码、补码和反码的表示形式不同,故当机器数移位时,对其空位的填补规则也不同。 不论是整数还是负数,移位后其符号位均不变。
- 机器数为正时,不论是左移还是右移,添补的代码均为0.
- 由于负数的原码数值部分与真值相同,故在移位时只要使符号位不变,其空位均添0即可。
- 由于负数的反码各位除符号位外与负数的原码正好相反,故移位后所舔代码应与原码相反,即全部添1。
- 负数的补码左移时,因空位出现在低位,则添补的代码与原码相同,即添0;右移时因空位出现在高位,则填补的代码应与反码相同,即添1。
对于正数,三种机器数移位后符号位均不变,左移时最高数位丢1,结果出错;右移时最低数位丢1,影响精度。
对于负数,三种机器数算术移位后符号位均不变。负数的原码左移时,高位丢1,结果出错;右移时,低位丢1,影响精度。负数的补码左移时,高位丢0,结果出错;右移时,低位丢1,影响精度。负数的反码左移时,高位丢0,结果出错;右移时,低位丢0,影响精度。
算数移位和逻辑移位的区别
有符号数的移位称为算数移位,无符号数的移位称为逻辑移位。逻辑移位的规则是:逻辑左移时,高位移丢,低位添0;逻辑右移时,低位移丢,高位添0。为了避免算术左移时最高数位丢1,可采用带进位(Cy)的移位。算术左移时,符号位移至Cy,最高数位就可避免移丢。
5.5.2 加法与减法运算
补码加法运算的基本公式
补码减法运算的基本公式
溢出判断
用一位符号位判断溢出
只要实际参加操作的两个数符号相同,结果又与原操作数的符号不同,即为溢出。
用两位符号位判断溢出
2为符号位的补码,即变形补码,它是以4为模的,其定义为
[x]_{补}=\left\{\begin{matrix} x& 1>x \ge 0& \\ 4+x,& 0> x \ge -1 (mod\;4) & \end{matrix}\right.
在用变形补码作加法时,2位符号位要连同数值部分一起参加运算,而且高位符号位产生的进位自动丢失,便可得正确结果,即
[x]补’+[y]补’=[x+y]补’(mod 4)
变形补码判断溢出的原则是: 当2位符号位不同时,表示溢出,否则无溢出。不论是否发生溢出,高位(第1位)符号位永远代表真正的符号。
补码加减运算控制流程
5.5.3 乘法运算
笔算乘法的改进
两数相乘的过程,可视为加法和移位两种运算。
例:设A=0.1101,B=0.1011,求A×B。
运算规则如下:
- 乘法运算可用移位和加法来实现,两个4位数相乘,总共需要4次加法运算和4次移位。
- 由乘数的末尾值确定被乘数是否与原部分积相加,然后右移一位,形成新的部分积;同时乘数也右移一位,由次低位作为新的末位,空出最高位放部分积的最低位。
- 每次作加法时,被乘数仅仅与原部分积的高位相加,其低位被移至成乘数所空出的高位位置。
用一个寄存器存放被乘数,一个寄存器存放乘积的高位,另一个寄存器存放乘数及乘积的低位,再配上加法器及其他相应电路,就可组成乘法器。又因加法只在部分积的高位进行,故不但节省了器材,而且还缩短了运算时间。
原码乘法
上述讨论结果可直接用于原码一位乘,只需加上符号位处理即可。
原码一位乘运算原则
以小数为例: 设 [x]原=x0.x1x2…xn [y]原=y0.y1y2…yn
则[x]原⋅[y]原=x0⊕y0.(0.x1x2…xn)(0.y1y2…yn) 式中,0.x1x2…xn为x的绝对值,记作x*;0.y1y2…yn为y的绝对值,记作y∗。
原码一位乘运算规则:
- 乘积的符号位由两原码符号位异或运算结果决定。
- 乘积的数值部分由两数绝对值相乘,其通式为:x∗⋅y∗=2−1(y1x∗+(…+2−1(yn−1x∗+2−1(ynx∗+0))…))
例:已知x=-0.1110,y=-0.1101,求[x⋅y]原。
故[x⋅y]原=0.10110110
补码乘法
例:已知[x]补=1.0101,[y]补=0.1101,求[x⋅y]补。
故乘积[x⋅y]补=1.01110001。
Booth算法
例:已知[x]补=0.1101,[y]补=0.1011,求[x⋅y]补。
故[x⋅y]补=0.10001111。
5.5.3 除法运算
分析笔算除法
特点可归纳如下:
- 每次上商都是由心算来比较余数(被除数)和除数的大小,确定商为“1”还是为“0”。
- 每做一次减法,总是保持余数不懂,低位补0,再减去右移后的除数。
- 上商的位置不固定。
- 商符单独处理。
上述规则若照搬到计算机里实现有一定困难:
- 机器不能“心算”上商,必须通过比较被除数(或余数)和除数绝对值大小来确定商值。
- 按照每次减法总是保持余数不懂低位补0,再减去右移后的除数这一规则,在要求加法器的位数必须为除数的两倍。
- 笔算求商时是从高位向低位逐位求的,而要求机器把每位商直接写到寄存器的不同位置也是不可取的。
原码除法
小数定点除法对被除数和除数有一定的约束,即必须满足下列条件:
- 0<被除数≤除数
实现除法运算时,还应避免除数为0或被除数为0。 原码除法中由于对余数的处理不同,又可分为 恢复余数法和 不恢复余数法(加减交替法)两种。
恢复余数法
特点是:当余数为负时,需加上除数,将其恢复成原来的余数。
例:已知x=−0.1011,y=−0.1101,求[x/y]原。
故商值为0.1101,商的符号位为x0⊕y0=1⊕1=0,故[x/y]原=0.1101。
第一次上的商在商的整数位上,这对小数除法而言,可用它作溢出判断。即当该位为“1”时,表示此除法溢出,不能进行,应由程序进行处理;当该位为“0”时,说明除法合法,可以进行。 在恢复余数法中,每当余数为负时,都需恢复余数,这就延长了机器出发的时间,操作也很不规则,对线路结构不利。加减交替法可克服这些缺点。
加减交替法
加减交替法又称为不恢复余数法,可以认为它是恢复余数法的一种改进算法。
分析原码恢复余数法得知:
- 当余数Ri>0时,可上商“1”,再对Ri左移一位后减除数,即2Ri−y∗。
- 当余数Ri<0时,可上商“0”,然后先做Ri+y∗,即完成恢复余数的运算,再做2(Ri+y∗)−y∗,即2Ri+y∗。
故原码恢复余数法可归纳为:
- 当Ri>0时,上商“1”,做2Ri−y∗的运算。
- 当Ri<0时,上商“0”,做2Ri+y∗的运算。
例:已知x=−0.1011,y=−0.1101,求[x/y]原。
故商值为0.1101,商的符号位为x0⊕y0=1⊕0=1,故[x/y]原=1.1101。
补码除法
补码加减交替法运算规则
补码除法的符号位和数值部分是一起参加运算的。 1.欲确定商值,必须先比较被除数和除数的大小,然后才能求得商值。 比较被除数和除数的大小
- 当被除数与除数同号时,做减法,若得到的余数与除数同号,表示“够减”,否则表示“不够减”。
- 当被除数与除数异号时,做加法,若得到的余数与除数同号,表示“够减”,否则表示“不够减”。
商值的确定
- 如果[x]补与[y]补同号,商为正,则“够减”时上商“1”,“不够减”时上商“0”。
- 如果[x]补与[y]补异号,商为负,则“够减”时上商“0”,“不够减”时上商“1”。
2.在补码除法中,商符是在求商的过程中自动形成的。
3.新余数[Ri+1]补的获得方法与原码加减交替法极相似
例:已知x=0.1001,y=0.1101,求[x/y]补。
所以[x/y]补=0.1011。
5.6 浮点四则运算
5.6.1 浮点加减运算
浮点数加减运算必须按以下几步进行:
- 对阶,使两数的小数点位置对齐。
- 尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)。
- 规格化,为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化。
- 舍入,为提高精度,要考虑尾数右移时丢失的数值位。
- 溢出判断,即判断结果是否溢出。
5.6.2 浮点乘除法运算
阶码运算
尾数运算
5.例题
6.5 已知[x]补,求[x]原和x。
[x1]补=1.1100; [x2]补=1.1001; [x3]补=0.1110; [x4]补=1.0000;
[x5]补=1,0101; [x6]补=1,1100; [x7]补=0,0111; [x8]补=1,0000
[x]补与[x]原、x的对应关系如下:
[x]补
1.1100
1.1001
0.1110
1.0000
1,0101
1,1100
0,0111
1,0000
[x]原
1.0100
1.0111
0.1110
无
1,1011
1,0100
0,0111
无
x
-0.0100
-0.0111
0.1110
-1
-1011
-100
0,0111
-10000
6.11 已知机器数字长为4位(含1位符号位),写出整数定点机和小数定点机中原码、补码和反码的全部形式,并注明其对应的十进制真值。
整数定点机
小数定点机
原码
补码
反码
真值
原码
补码
反码
真值
0,000
0,000
0,000
+0
0.000
0.000
0.000
+0
0,001
0,001
0,001
1
0.001
0.001
0.001
0.125
0,010
0,010
0,010
2
0.010
0.010
0.010
0.250
0,011
0,011
0,011
3
0.011
0.011
0.011
0.375
0,100
0,100
0,100
4
0.100
0.100
0.100
0.500
0,101
0,101
0,101
5
0.101
0.101
0.101
0.625
0,110
0,110
0,110
6
0.110
0.110
0.110
0.750
0,111
0,111
0,111
7
0.111
0.111
0.111
0.875
1,000
0,000
1,111
-0
1.000
0.000
1.111
-0
1,001
1,111
1,110
-1
1.001
1.111
1.110
-0.125
1,010
1,110
1,101
-2
1.010
1.110
1.101
-0.250
1,011
1,101
1,100
-3
1.011
1.101
1.100
-0.375
1,100
1,100
1,011
-4
1.100
1.100
1.011
-0.500
1,101
1,011
1,010
-5
1.101
1.011
1.010
-0.625
1,110
1,010
1,001
-6
1.110
1.010
1.001
-0.750
1,111
1,001
1,000
-7
1.111
1.001
1.000
-0.875
无
1,000
无
-8
无
1.000
无
-1
6.20 用原码一位乘、两位乘和补码一位乘(Booth算法)、两位乘计算x·y。
(1)x= 0.110 111,y= -0.101 110;
(2)x= -0.010 111,y= -0.010 101;
(3)x= 19,y= 35;
(4)x= 0.110 11,y= -0.111 01。
6.27
(1)
x=2101*0.101100. y=2100*(-0.100100).
[x]补=00,101;00.101100. [y]补=00,100;1.011100
1)对阶
[E]补=[Jx]补+[-Jy]补=00,101+11,100=00,001>0
应Jy向Jx对齐,则
[Jy]补=00,100+00,001=[Jx]补
[y]补=00,101;11.101110
2)尾数运算
[Sx]补+[Sy]补=00.101100+11.101110=00.011010>0
3)规格化
左规1位,阶码减1
4)舍入:无
5)溢出:无
则x+y=2100*0.110100=24*(13/16)
本文作者:jujimeizuo
本文地址: https://blog.jujimeizuo.cn/2021/06/17/jizu5/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!