1.6.2.1 机器数与真值
机器数是一个数在计算机中的表示形式,一个机器数所表示的实际数值称为真值。上面提到的二进制数,没有提到符号问题,故是一种无符号数的表示。对无符号数,机器数与真值相同,此时计算机的全部有效位都用来存放数据,它能表示的最大数值取决于计算机的字长。对于n位字长的计算机来说,表示无符号的整数范围为0~2n-1,例如8位二进制无符号数表示的范围为00000000B~11111111B(即0~255)。
带符号数的习惯表示方法是在数值前用“+”号表示正数,“-”号表示负数。计算机只能识别0和1,对数值的符号也不例外。对于带符号的数,在计算机中,通常将一个数的最高位作为符号位,最高位为0,表示符号位为正;最高位为1,表示符号位为负。例如:
式中,等号左边的+18和-18分别是等号右边的机器数所代表的实际数,即真值。
1.6.2.2 带符号数机器数的3种表示方法
实际上,机器数可以有不同的表示方法。对有符号数,机器数常用的表示方法有原码、反码、补码3种。
1.原码
上述以最高位为0表示正数,1表示负数,后面各位为其数值,这种数的表示法称为原码表示法。换言之,设机器数位长为n,则数X的原码可定义为:
原码的特点:
(1)表示简单、直观,与真值间转换方便,数值部分即为该带符号数的二进制值。
(2)8位二进制原码能表示的数值范围为1 1111111 B~0 1111111 B,即-127~+127;对于n位字长的计算机来说,其原码表示的数值范围为-(2n-1-1)~2n-1-1,它对应的原码为111…1B~011…1B。
(3)0有+0和-0两种表示方法。由于“0”有+0和-0之分,若字长为8位,则数0的原码有两种不同形式为:[+0]原=0 0000000 B,[-0]原=1 0000000 B。
(4)用它做加减法运算不方便。若两个异号数相加或两个同号数相减时,必须做减法。
2.反码
对于正数,其反码形式与其原码相同,最高位0表示正数,其余位为数值位;但对于负数,将其原码除符号位以外其余各位按位取反,即可得到其反码表示形式。可见,n位二进制反码的定义可表示为:
例如,若字长为8位,则 对于正数[+5]原=[+5]反=0 0000101B,[+127]原=[+127]反=0 1111111 B;对于负数[-5]原=1 0000101 B,[-5]反=1 1111010 B,[-127]原=1 1111111,[-127]反=1 0000000 B。
反码的特点:
(1)表示较复杂,与真值间转换不太方便。将反码还原为真值的方法是:反码→原码→真值,即[X]原=[[X]反]反。即当反码的最高位为0时,后面的二进制序列值即为真值,且为正;最高位为1时,则为负数,后面的数值位要按位求反才为真值。例如:[X]反=10101010 B,它是一个负数,其中后7位为0101010,取反得1010101,所以负数X=-(1×26+1×24+1×22.+1×20)=-85。
(2)数0的反码也是两种形式。“0”也有+0和-0之分,若字长为8位,则[+0]原=[+0]反=0 000000;[-0]原=1 0000000,[-0]反=1 1111111。
(3)8位二进制反码所能表示的数值范围为1 0000000 B~0 1111111 B,即-127~+127;n位字长的反码表示的数值范围为-(2n-1-1)~2n-1-1,它对应的反码为1 00…0B~0 11…1B。
(4)用它做加减法运算也不方便。若两个异号数相加或两个同号数相减时,也必须做减法。
3.补码
正数的补码与其原码相同,最高位为符号位,其余为数值位。负数的补码即为它的反码在最低位加上1,也就是将其原码除符号位外各位取反加1而得到。因此,补码的定义可用表达式表示为:
例如,若字长为8位,则对于正数[+5]原=[+5]补=0 0000101B,[+127]原=[+127]补=0 1111111B;对于负数[-5]原=1 0000101 B,[-5]补=1 1111011 B,[-127]原=1 1111111 B,[-127]补=1 0000001 B,[-128]补=1 0000000 B。
补码的特点:
(1)表示也较复杂,与真值间转换也不太方便。将补码还原为真值的方法是:补码→原码→真值,而[X]原=[[X]补]补,即若补码的符号位为0,则其后的数值的值即为真值,且为正;若符号位为1,则应将其后的数值位按位取反加1,所得结果才是真值,且为负。
(2)数0的补码是唯一的。无+0和-0之分,若字长为8位,则[+0]补=[-0]补=00000000 B。
(3)8位二进制补码所能表示的数值范围为1 0000000 B~0 1111111 B,即-128~+127;n位字长的补码表示的数值范围为-2n-1~2n-1-1,它对应的补码为1 00…0B~0 11…1B。注意,原码、反码和补码三者中只有补码可以表示-2n-1。
(4)可把减法运算化为加法运算。在计算机机器内部,为了避免做减法,把减法运算统一转换为加法运算,即用一个加法器来完成加减法运算,引入补码可实现这一目的。
综上所述,可以得出结论:
(1)原码、反码、补码的最高位都是表示符号位。符号位为0时,表示真值为正数,其余位为真值。符号位为1时,表示真值为负,其余位除原码外不再是真值;对于反码,需按位取反才是真值;对于补码,则需按位取反再加1才是真值。
(2)对于正数,3种编码都是一样的,即[X]原=[X]反=[X]补;对于负数,3种编码互不相同。所以,原码、反码、补码本质上是用来解决负数在机器中表示的3种不同的编码方法。
(3)二进制位数相同的原码、反码、补码所能表示的数值范围不完全相同。对于8位二进制带符号数,它们表示的真值、机器数范围分别为:
原码:真值为-127~+127,机器数为11111111B~01111111B(即FFH~7FH)。
反码:真值为-127~+127,机器数为10000000B~01111111B(即80H~7FH)。
补码:真值为-128~+127,机器数为10000000B~01111111B(即80 H~7FH)。
而8位二进制无符号数的真值、机器数范围分别为:
真值为0~255,机器数为00000000B~11111111B(即00 H~FFH)。
(4)微机基本上都是以补码作为机器码,原因是补码的加减法运算简单,减法运算可变为加法运算,可省掉减法器电路;而且它是符号位与数值位一起参加运算,运算后能自动获得正确结果。
1.6.2.3 二进制数的加减运算
计算机把机器数均当作无符号数进行运算,即符号位也参与运算。运算的结果要根据运算结果的符号标志位(如进位CY和溢出OV等)来判别正确与否。计算机中设有这些标志位,它们的值由运算结果自动设定。
1.无符号数的运算及进位概念
无符号数的整个数位全部用于表示数值。n位无符号二进制数据的范围为0~2n-1。
(1)两个无符号数相加。若两个加数的和超过其位数所允许的最大值(上限)时,最高位就会产生进位,CY=1;否则,无进位,CY=0,结果正确。例如:下面两个8位无符号二进制数相加。
第1个例子,两数相加之和没有超过8位最大值255(上限),CY=0,结果127+16=8F H=143正确;第2个例子,两数相加之和超过8位最大值255,CY=1,结果127+160=1FH(即31)错误,但如果把进位CY作为最高位,则结果127+160=11FH(当作无符号数)=287就正确了。
(2)两个无符号数相减。若被减数小于减数,相减结果小于所允许的最小值0(下限)时,最高位就会产生借位,CY=1;被减数不小等于减数,无借位,CY=0,结果正确。例如:下面两个8位无符号二进制数相减。
第1个例子,两数相减的值没有低于8位最小值0(下限),无借位,CY=0,结果192-10=B6 H=182正确;第2个例子,两数相减的值小于8位最小值0(下限),有借位,CY=1,结果10-192=4AH(即74)错误,但如果把进位CY作为最高位,则结果127+160=14AH(当作补码)=-B6 H=-182就正确了。
由此可见,对无符号数进行加法或减法运算,其结果的符号用进位CY来判别:CY=0(无进位或借位),结果正确;CY=1(有进位或借位),结果错误,但若把CY记作最高位,结果就正确了。
2.带符号数的补码运算及溢出概念
(1)补码的加减法运算。微机中带符号数采用补码形式存放和运算,其运算结果自然也是补码。补码加减运算的运算特点是:符号位与数字位一起参加运算,并且自动获得结果(包括符号位与数字位)。设X、Y是两个任意的二进制数,补码的加减法运算规则为:
式中:X、Y为正、负数均可。该式说明,无论加法还是减法运算,都可由补码的加法运算实现,运算结果(和或差)也以补码表示。若运算结果不产生溢出,且最高位(符号位)为0,则表示结果为正数,最高位为1,则结果为负数。(www.xing528.com)
补码的加减法运算规则的正确性可根据补码定义给予证明:[X±Y]补=2n+(X±Y)=(2n+X)+(2n±Y)=[X]补+[±Y]补。
采用补码运算可以将减法变成补码加法运算,在微处理器中只需加法的电路就可以实现加法、减法运算。例如,若X=33,Y=45,采用8位补码计算X+Y和X-Y。
由于[X]补=00100001B,[Y]补=00101101B,[-Y]补=11010011B,则[X+Y]补=[X]补+[Y]补=01001110B,[X-Y]补=[X]补+[-Y]补=11110100B。因此,X+Y=[[X+Y]补]补=01001110B=+78,X-Y=[[X-Y]补]补=10001100 B=-12。显然,运算结果是正确的。
从上述补码运算规则和举例可看出,用补码表示计算机中的有符号数优点明显:
1)负数的补码与对应正数的补码之间的转换可用同一种方法——求补运算实现,因而可简化硬件。
2)可将减法变为加法运算,从而省去减法器电路。
3)有符号数和无符号数的加法运算可用同一加法器电路完成,结果都是正确的。例如,两个内存单位的内容分别为00010010和11001110,无论它们代表有符号数补码还是无符号数二进制码,运算结果都是正确的。
(2)运算溢出的判断方法。由于计算机的字长有一定限制,所以一个带符号数是有一定范围的。8位字长的二进制数补码表示带符号数的范围为-128~+127,n位字长补码表示的范围为+2n-1~-2n。当运算结果超过这个表达范围时,便产生溢出。在溢出时运算结果会出错。显然,只有在同符号数相加或者异符号数相减的情况下,才有可能产生溢出。那么是否有一个便于操作的方法来判断是否产生溢出呢?先看以下4个例子。
【例1-5】
令CY为符号位向高位的进位,CY-1为数值部分向符号位的进位,此例中,CY=CY-1=0,结果在8位二进制补码表示范围内,没有溢出,OV=0。
【例1-6】
此例中,CY=CY-1=1,结果正确,没有溢出,OV=0。
【例1-7】
此例中,CY=0,CY-1=1,CY≠CY-1,产生了错误的结果,发生了溢出,OV=1。
【例1-8】
此例中,CY=1,CY-1=0,CY≠CY-1,同样结果是错误的,即发生了溢出,OV=1。
从上面4例可知,在例1-5和例1-6中,运算结果在8位二进制数的范围内,没有溢出,OV=0,结果正确,它们的共同规律是CY=CY-1;在例1-7和例1-8中,运算结果都超出了8位二制数表示的范围,分别产生了正溢出和负溢出,OV=1,因此产生了错误的结果,它们的共同点是CY≠CY-1。
综合以上4例的情况,可用下述逻辑表达式进行溢出OV判断:
式中:⊕表示异或,用一异或电路即可实现。这种方法称为双高进位法。
(3)进位与溢出的区别。从上面分析可知,进位与溢出是两个不同概念。进位CY是指不考虑是否有符号,按二进制位依次相加后最高位有进位,而溢出OV是指考虑有符号,当两个同符号数相加结果改变符号时出现溢出错误。具体地讲,进位CY是指两个操作数在进行算术运算后,最高位(对于8位操作为D7位)是否出现进位或借位的情况,有进位或借位,CY置“1”,否则置“0”;溢出OV是反映带符号数(以二进制补码表示)运算结果是否超过机器所能表示的数值范围的情况。对8位运算,数值范围为-128~+127。若超过上述范围,称为“溢出”,OV置“1”。
对于同一运算,溢出OV和进位CY两个标志不一定同时发生,例如,例1-7中出现OV=1、CY=0,而例1-6中出现CY=1、OV=0。当然,两个标志也可能出现相同的情况,例如,例1-5中出现了OV=0、CY=0,而例1-8中出现CY=1、OV=1。
根据前述知,进位标志CY用于表示无符号数运算结果是否超出范围,即使CY=1运算结果仍然正确;溢出标志OV用于表示有符号数运算结果是否超出范围,若CV=1则运算结果已经不正确。
实际上,对于无符号数来说,不存在溢出的问题,它的进位就相当于符号数中的溢出,而对于带符号数来说,不存在进位的问题。
1.6.2.4 二进制数的扩展
从上面分析可知,若8位二进制补码运算结果超出-128~+127时,则超出了8位表示范围,会产生溢出。产生溢出的原因是数据的位数少了,使得结果的数值部分挤占了符号位的位置。因此,为了避免产生溢出,可以将数位扩展。
二进制的扩展是指一个数据从位数较少扩展到位数较多,如从8位扩展到16位。一个二进制数扩展后,其数的符号和大小应保持不变。
1.无符号数的扩展
对于无符号数据,其扩展是将其左边添加0。如8位无符号二进制数E6 H扩展为16位无符号二进制数,则为00E6H。
2.带符号数的扩展
对于原码表示的带符号数据,它的正数和负数仅1位符号位相反,数值位都相同。因此,原码二进制数的扩展是将其符号位向左移至最高位,符号位即最高位与原来的数值位间的所有空位都填入0。例如,68用8位二进制数表示的原码为44H,用16位二进制数表示的原码为0044H;-68用8位二进制数表示的原码为C4H,用16位二进制数表示的原码为8044H。
对于补码表示的带符号数据,其符号位向左扩展若干位后,所得到的补码数的真值不变。因此,正数的扩展应该在其前面补0,而负数的扩展则应该在其前面补1。例如,68用8位二进制数表示的补码为44H,用16位二进制数表示的补码为0044H;-68用8位二进制数表示的补码为BCH,用16位二进制数表示的补码为FFBCH。
以上各节介绍的数均未涉及到小数点的表示,当所要处理的数含有小数部分时,就有一个如何表示小数点的问题,那么计算机中如何处理小数点的问题呢?在计算机中并不用某个二进制位来表示小数点,而是隐含规定小数点的位置。
根据小数点位置是否固定,数的表示方法可分为定点表示和浮点表示,相应的机器数就叫定点数和浮点数。定点数就是小数点在数中的位置是固定不变的,而浮点数则是小数点的位置是浮动的。
通常,对于任意一个二进制数X,都可表示为:
式中:S表示全部有效数字,称之为数X的尾数;P为数X的阶码,它指明了小数点的位置;2是阶码的底。S和P均为用二进制表示的数,它们可正可负。阶码常用补码表示法,尾数常为原码表示的纯小数。当P值可变时,表示是浮点数。
1.定点数
在计算机中,根据小数点固定的位置不同,定点数有定点(纯)整数和定点(纯)小数两种。当阶码P=0,若尾数S为纯整数时,说明小数点固定在数的最低位之后,即称为定点整数。当阶码P=0,若尾数S为纯小数时,说明小数点固定在数的最高位之前,即称为定点小数。定点整数和定点小数在计算机中的表示形式没什么区别,其小数点完全靠事先约定而隐含在不同位置,如图1-17所示。
图1-17 定点整数和定点小数格式
2.浮点数
当要处理的数是既有整数又有小数的混合小数时,采用定点数格式很不方便。为此,人们一般都采用浮点数进行运算。如果阶码P不为0,且可以在一定范围内取值,这样的数称为浮点数。浮点数的格式、字长因机器而异。浮点数一般由4个字段组成,其一般格式如图1-18所示,其中阶码一般用补码定点整数表示,尾数一般用补码或原码定点小数表示。
图1-18 浮点数格式
浮点数的实际格式多种多样。如80486的浮点数格式就不是按上述格式存放4个字段的,而是将数符位Sf置于整个浮点数的最高位(阶码部分的前面),且尾数和阶码部分有其与众不同的约定。
为保证不损失有效数字,一般还对尾数进行规格化处理,即保证尾数的最高位是1,实际大小通过阶码进行调整。
例如,某计算机用32位表示一个浮点数,格式如图1-19所示。图中,阶码部分为8位补码定点整数,尾数部分为24位补码定点小数(规格化)。
图1-19 32位浮点数格式
下面来求十进制数-258.75的机器数。
所以,-258.75在该计算机中的浮点表示为0 0001001 1 01111110101000000000000。
按照这一浮点数格式,可计算出它所能表示的数值范围为:-1×227-1~+(1-2-23)×227-1。显然,它比32位定点数表示的数值范围(最大为-231~231-1)要大得多。一般对于位数相同的计算机,浮点法能表示的范围比定点法大,这也正是浮点数表示优于定点数表示的突出优点之一,但浮点数运算复杂,数据表示不直观。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。