1.2 计算机中数据的表示及电路

人们要计算机执行的任何操作都必须转换为计算机所能识别的二进制数的形式,计算机对任何信息的处理实际上是对二进制数的处理。计算机中各种不同的信息形式,需要对其进行编码或进行不同码制之间的数据转换。

1.2.1 计算机使用的数制及转换

1.数制 数制就是计数方式。

日常生活中常用的是十进制计数方式,而计算机内部使用的是二进制数据。因此,计算机在处理数据时,必须进行数制之间的相互转换。

(1)二进制数

二进制数只有两个数字符号:0和1,计数时按“逢二进一”的原则进行计数,也称其基数为二。

一般情况下,二进制数可表示为:(110)2、(110.11)2、10110B等。

在任何进制数制中,每个数所处位置不同,实际代表的数值也不相同,把不同位置所表示的数值称为权值,二进制也如同十进制一样可以写成一种展开的形式。

所谓按位权展开法,就是将任一r进制数的各位的权值乘以该位的数值,然后求和。

例如,十进制数123=1×102+2×101+3×100。

任一个r进制数都可以表示成:

978-7-111-53315-3-Chapter01-5.jpg

上式中,r称为基数(二进制数为2),di表明第i位上可取的数字(如二进制数取0或1);i为0~m时,从低到高依次表示整数位,i为−1~−n时,则依次表示小数位;ri(即r的i次方)称为第i位的权值。

把一个r进制数N按权展开,则N可表示为r进制数的每位数字di乘以其权ri所得积之和。

根据位权表示法,每一位二进制数在其不同位置表示不同的值。例如:

978-7-111-53315-3-Chapter01-6.jpg

对于8位二进制整数(由低位~高位分别用D0~D7表示)及小数部分(十分位~万分位分别用D−1~D−4表示),则各位所对应的权值如下。

978-7-111-53315-3-Chapter01-7.jpg

对于任何二进制数,可按位权求和展开为与之相应的十进制数,例如

(10)2=1×21+0×20=(2)10

(10.1)2=1×21+0×20+1×2−1=(2.5)10

(11)2=1×21+1×20=(3)10

(110)2=1×22+1×21+0×20=(6)10

(111)2=1×22+1×21+1×20=(7)10

(1111)2=1×23+1×22+1×21+1×20=(15)10

(10110)2=1×24+0×23+1×22+1×21+0×20=(22)10

对于8位二进制整数,其最大值为:

(11111111)2=1×27+1×26+1×25+1×24+1×23+1×22+1×21+1×20=(255)10=28−1

对于16位二进制整数,其最大值为:

(1111111111111111)2=65535=216−1

对于n位二进制整数,其最大数值为:2n−1。

例如,二进制数10110111,按位权展开求和计算可得:

(10110111)2=1×27+0×26+1×25+1×24+0×23+1×22+1×21+1×20

=128+0+32+16+0+4+2+1

=(183)10

例如,二进制数10110.101,按位权展开求和计算可得:

(10110.101)2=1×24+1×22+1×21+1×2−1+0×2−2+1×2−3

=16+4+2+0.5+0.125

=(22.625)10

必须指出:在计算机中,一个二进制数(如8位、16位或32位)既可以表示数值,也可以表示一种符号的代码,还可以表示某种操作(即指令),计算机在程序运行时按程序的规则自动识别,这就是所谓的一切信息都是以二进制数据进行存储的。

(2)十六进制数

计算机在信息输入/输出或书写相应程序或数据时,可采用简短的十六进制数表示相应的位数较长的二进制数。

十六进制数有16个数字符号,其中0~9与十进制相同,剩余6个为A、B、C、D、E、F(或a、b、c、d、e、f),分别表示十进制数的10~15,见表1-1。

1-1 二进制、十进制、八进制、十六进制转换表

978-7-111-53315-3-Chapter01-8.jpg

十六进制数的计数原则是“逢十六进一”,也称其基数为16,整数部分各位的权值由低位到高位分别为:160、161、162、163…。

例如:

978-7-111-53315-3-Chapter01-9.jpg

为了便于区别不同进制的数据,一般情况下可在数据后跟一后缀:

二进制数用“B”表示(如00111010B);

十六进制数用“H”表示(如3A5H,);

十进制数用“D”表示(如39D或39);

八进制数用“Q”表示(如123Q)。

对于以A~F或a~f开始的十六进制数,则在该数据前加0。

例如:0AF36H=0AH×163+0FH×162+3×161+6×160

=10×163+15×162+3×161+6×160

(3)八进制数

八进制数使用0、1、2、3、4、5、6、7共8个数字符号,八进制数的计数原则是“逢八进一”,也称其基数为8,整数部分各位的权值由低位到高位分别为:80、81、82、83…。

例如:(127)8=127Q=1×82+2×81+7×80

2.不同数制之间的转换 计算机中的数只能用二进制表示,十六进制数读写方便,而日常生活中使用的是十进制数。因此,计算机必须根据需要对各种进制数据进行转换。

(1)二进制数与十进制数相互转换

对任意二进制数均可按权值展开将其转化为十进制数。例如:

978-7-111-53315-3-Chapter01-10.jpg

十进制数转换为二进制数,可将整数部分和小数部分分别进行转换,然后合并。其中整数部分可采用“除2取余法”进行转换,小数部分可采用“乘2取整法”进行转换。

1)除2取余法。

例如:采用“除2取余法”将37D转换为二进制数。

978-7-111-53315-3-Chapter01-11.jpg

把所得余数由高到低排列起来可得:37=100101B

2)乘2取整法。

例如:采用“乘2取整法”将0.625转换为二进制数小数

978-7-111-53315-3-Chapter01-12.jpg

直至小数部分为0(若不为0,则根据误差要求取小数位)。

把所得整数由高到低排列起来可得:0.625=0.101B。

同理,把37.625转换为二进制数,只需将以上转换合并起来可得:37.625=100101.101B。

【例1-1】把十进制数57.63转换成二进制数。

可将十进制数57.63的整数部分和小数部分分别转换。十进制整数转换成二进制数,整数部分可以采取除2取余法。小数转换成二进制数可以采取乘2取整法。

求整数部分:

978-7-111-53315-3-Chapter01-13.jpg

求小数部分

978-7-111-53315-3-Chapter01-14.jpg

则 57.63D=111001.1010B

十进制数转换为二进制数,也可以采用权值比较法。

所谓权值比较法,即将十进制数与二进制位权从高位到低位逐位比较,若该位十进制数权值大于或等于二进制某位权值,则该位取“1”,否则该位取“0”,采用按位分割法进行转换。

例如:将37.625转换为二进制数。

978-7-111-53315-3-Chapter01-15.jpg

将整数部分37与二进制各位权值从高位到低位比较,37>32,则该位取1,剩余37−32=5,逐位比较,得00100101B。

将小数部分0.625按同样方法转换,得0.101B。

结果为:37.625D=100101.101B。

(2)二进制数与十六进制数的相互转换

在计算机进行输入、输出显示时,常采用十六进制数。十六进制数可看作是二进制数的简化表示。

因为24=16,所以1位十六进制数可表示4位二进制数,其二进制、十进制、八进制、十六进制对应数的转换关系见表1-1。

在将二进制数转换为十六进制数时,其整数部分可由小数点开始向左每4位为一组进行分组,直至高位,若高位不足4位,则左侧补0使其成为4位二进制数,然后按表1-1中的对应关系进行转换。其小数部分由小数点向右每4位为一组进行分组,不足4位则末位补0,使其成为4位二进制数,然后按表1-1的对应关系进行转换。

例如:

978-7-111-53315-3-Chapter01-16.jpg

需要将十六进制数转换为二进制数时,则为上述方法的逆过程

例如:0C5.A7H=11000101.10100111 B

例如:

978-7-111-53315-3-Chapter01-17.jpg

即7ABFH=111101010111111B

3)二进制数与八进制数的相互转换

因为23=8,所以1位八进制数可表示3位二进制数,转换关系见表1-1。

在将二进制数转换为八进制数时,其整数部分可由小数点开始向左每3位为一组进行分组,直至高位。若高位不足3位,则补0,使其成为3位二进制数,然后按表1-1的对应关系进行转换。其小数部分由小数点向右每3位为一组进行分组,不足3位则末位补0,使其成为3位二进制数,然后按表1-1的对应关系进行转换。

例如:123Q=001010011B

1011111B=001011111B=137Q

(4)十进制数与十六进制数的相互转换

十进制数与十六进制数的相互转换可直接进行,也可先转换为二进制数,然后再把二进制数转换为十六进制数或十进制数。

例如:将十进制数37D转为十六进制数。

37D=100101B==00100101B=25H

例如:将十六进制数41H转换为十进制数。

41H=01000001B=65D

也可按位权展开求和方式将十六进制数直接转换为十进制数,这里不再详述。

1.2.2 二进制运算及电路实现

对二进制数0和1,既可以表示数值,也可以表示逻辑关系,因而二进制数有两种不同类型的运算,即算术运算和逻辑运算。

1.二进制算术运算及电路实现

二进制加法运算是计算机的基本运算,其运算电路是计算机中最核心的功能电路。

(1)二进制算术运算

1位二进制数的加法基本运算规则如下。

978-7-111-53315-3-Chapter01-18.jpg

对于多位二进制数的运算,从低位到高位依次进行相加,逢二进一,同时要考虑低位向高位产生的进位位。

例如,8位二进制数加法

978-7-111-53315-3-Chapter01-19.jpg

(2)1位二进制加法电路

1)半加器电路。

设第0位二进制数输入量A0和B0相加,输出量为本位和S1和进位位C0,其真值表如图1-5a所示。由真值表得到输入与输出之间的逻辑表达式如下。

978-7-111-53315-3-Chapter01-20.jpg

由此得到1位二进制加法电路称为半加器电路,如图1-5b所示

978-7-111-53315-3-Chapter01-21.jpg

图1-5 半加器的真值表及逻辑电路

a)真值表 b)逻辑电路

半加器电路适用于多位二进制数加法的第0位(最低位)。

2)全加器电路。

设二进制数第i位输入量为Ai、Bi和Ci(低位向高位的进位位),输出量为本位和Si、进位位Ci+1,其真值表如表1-2所示。

由表1-2可得,实现输出Si和Ci+1的电路如图1-6所示,由此得到第i位二进制数相加的电路称为全加器。

1-2 全加器真值表

978-7-111-53315-3-Chapter01-22.jpg

978-7-111-53315-3-Chapter01-23.jpg

图1-6 全加器电路

3)半加器及全加器符号。

上述半加器和全加器常用图1-7所示的符号来表示。HA(Half Adder)意为半加器,FA Full Adder)是全加器。

978-7-111-53315-3-Chapter01-24.jpg

图1-7 半加器与全加器的符号表示

a)半加器符号 b)全加器符号

(3)多位二进制数的加法电路

利用半加器和全加器,可以组合多位简单的加法电路,计算机运算器中的加法器一般为32位或64位,为分析方便,这里给出的4位二进制加法电路如图1-8所示。

978-7-111-53315-3-Chapter01-25.jpg

图1-84 位二进制加法电路

设二进制数为A=A3A2A1A0=1010=10D,B=B3B2B1B0=1011=11D,则按照图1-8所示电路完成A与B相加的过程,可写成如下竖式算法。

978-7-111-53315-3-Chapter01-26.jpg

(4)可控反相器及加法/减法电路

利用补码可以将减法变为加法运算,即减去一个数,等于加上这个数的补码(求反加1见1.2.3节),4位二进制补码加法器/减法器如图1-9所示。

978-7-111-53315-3-Chapter01-27.jpg

图1-9 4位二进制补码加法器/减法器

在图1-9中,由4个全加器FA和4个可控反相器(异或门)构成。异或门电路如图1-10所示,其真值表见表1-3。

978-7-111-53315-3-Chapter01-28.jpg

图1-10 可控反相器

1-3 异或门真值表

978-7-111-53315-3-Chapter01-29.jpg

可以看出,当加减控制信号SUB=0时,Y与Bi相同,电路可以作为加法器;当SUB=1时,Y与Bi相反,电路可作为减法器来使用。

设A=A3A2A1A0=1010B=10D,B=B3B2B1B0=0011B=03D,将这两个数的各位分别送入该电路的对应端A3A2A1A0和B3B2B1B0,其工作过程如下。

1)作加法器使用。当SUB=0时,使B3B2B1B0的各位同相地进入相应的全加器,与A3A2A1A0分别相加;而最低位的C0=SUB=0,使该位的全加器与半加器等价,运算结果如下。

S=S3S2S1S0=A3A2A1A0+B3B2B1B0=1010+0011=1101B=13D

2)作减法器使用。当SUB=1时,异或门对B3B2B1B0求反后进入全加器,而最低位的C0=SUB=1,使B的反码加上了1,转化成补码与A3A2A1A0分别相加。运算结果如下。

S=S3S2S1S0=A3A2A1A0+3210BBBB+1=1010+1100+1=0111B=7D

978-7-111-53315-3-Chapter01-30.jpg

2)逻辑乘(也称“与”运算,用符号“AND”或“∧”或“”表示),其运算规则如下

978-7-111-53315-3-Chapter01-31.jpg

3)取反(也称“非”运算,用符号“NOT”或上画线“¯”表示),“0”取反后是“1”“1”取反后是“0”。

4)基本逻辑运算可以扩展为或非、与非、异或(用符号XOR或⊗表示)等运算。

逻辑运算是按位处理,不考虑位之间的进位关系。

例如,设A=0101B,则NOT A的结果为1010B。

例如,设A=0101B,B=0011B。

则A OR B的运算为

978-7-111-53315-3-Chapter01-32.jpg

A AND B的运算为

978-7-111-53315-3-Chapter01-33.jpg

则A XOR B的运算为

978-7-111-53315-3-Chapter01-34.jpg

2)二进制基本逻辑电路

计算机中的逻辑电路包括与门、或门和非门基本门电路(或称判定元素)及其组合,其电路的符号、名称及表达式如图1-11所示

978-7-111-53315-3-Chapter01-35.jpg

图1-11 计算机逻辑门电路

(3)触发器

触发器是计算机中寄存器或存储器的基本单元电路。常用的触发器有D触发器、T型触发器、S-R触发器及J-K触发器。触发器一般由与、或、非门等基本逻辑电路组成。

一个触发器可用来储存一位二进制数据,将多个触发器连接在一起可存储多位元数据。

D触发器是最常用的触发器之一,基于上升沿触发的D触发器原理图、符号及时序图如图1-12所示。对于上升沿触发D触发器来说,其输出Q只在C1由低到高的转换时刻才会跟随输入D的状态而变化,其他时刻输出Q则维持不变。

978-7-111-53315-3-Chapter01-36.jpg

图1-12 D触发器原理图、符号及时序图

a)原理图 b)符号c) 时序图

(4)移位寄存器

移位寄存器是一种多位元的寄存器,在每个时钟的转换时刻,寄存器中的数据进行一次移位。移位寄存器中一组触发器以串接的形式相连,即每个触发器的输出都连接到下一个触发器的输入。因此,每次时钟输入被触发时,数据会依次移位。表1-4列出了8位移位寄存器的移位过程。

1-48 位移位寄存器的移位过程

978-7-111-53315-3-Chapter01-37.jpg

978-7-111-53315-3-Chapter01-38.jpg

移位寄存器的输入和输出可以是串行或并行模式。

1)串行输入-并行输出。串行输入是指逐一位元读入数据,而并行输出是指所有位元同一时间作为输出。

2)并行输入-串行输出。并行输入是指所有位元同一时间作为输入,串行输出是指逐一位元依次输出。

计算机中大部分电路是以多个位元的并行模式工作,而串行接口则具有结构简单、便于远距离传送等优点,这就需要移位寄存器来完成串行接口和并行接口之间的转换。

1.2.3 二进制数编码

数据在计算机中的表现形式称为编码。

计算机通过输入设备(如键盘)输入的信息和通过输出设备输出的信息是多种形式的,既有数值型数据,也有非数值型数据,如字符、字母、各种控制符号及汉字等。计算机内部所有的数据均用二进制代码的形式表示,为此,需要对常用的数据及符号等进行编码,以表示不同形式的信息。

1.机器数与真值

一个数在计算机中的表示形式(编码)叫作机器数,而这个数本身(可以含符号“+”或“−”)称为机器数的真值。

在计算机中,二进制整数可分为无符号整数和有符号整数。

(1)无符号整数

对于二进制无符号整数,所有位都有与之相应的权值作为该位所表示的数值,其机器数就是二进制数本身。

例如:

N1=105=01101001B(表示N1的真值),其机器数为01101001。

8位无符号二进制数的机器数表示范围为:(00000000)2~(11111111)2(即0~28−1)。

16位无符号二进制数的机器数表示范围为:

(0000000000000000)2~(1111111111111111)2(即0~216−1)

n位二进制无符号整数的表示范围为:0~2n−1。

无符号整数在计算机中常用来表示存储器单元及输入/输出设备的地址。一般可用8位、16位或32位二进制数来表示,其取值范围分别为0~255、0~65535、0~232−1。

(2)有符号整数

对于二进制有符号整数的机器数(此类整数既可表示正整数,又可表示负整数),用二进制数的最高位表示符号位,最高位为“0”表示正数,最高位为“1”表示负数,其余各位取与之相应的权值作为该位所表示的数值。对于一个有符号数,可因其编码不同而有不同的机器数表示法。

2.原码、反码和补码 有符号数在计算机中的编码形式有原码、反码和补码3种。

(1)原码

如上所述,正数的符号位用“0”表示,负数的符号位用“1”表示,其数值部分不变,这种编码形式称为原码。

例如,以8位二进制数为例(以下均同),设两个数N1、N2,其真值为:

N1=105=+01101001B

N2=−105=−01101001B

则对应的原码为:

[N1]原=01101001B(最高位“0”表示正数)

[N2]原=11101001B(最高位“1”表示负数)

原码表示方法简单、直观,便于与真值进行转换。但计算机在进行减法操作时,实际上是把减法运算转换为加法运算,因此,必须引进反码和补码。

(2)反码与补码

对于正数,其反码、补码与原码表示方式相同。

仍以上面N1为例,则有:

[N1]补=[N1]反=[N1]原=01101001B

1)对于负数,其反码为对原码各位求反(即0变为1,1变为0)但符号位不变)。由于反码在计算机中计算时比较麻烦,一般不直接使用。反码通常作为求补码运算时的中间形式。

2)负数的补码为:原码的符号位不变,其数值部分按位取反后再加1(即负数的反码加1),称为求补。

仍以上面为例,N2=−105,则有

978-7-111-53315-3-Chapter01-39.jpg

3)如果已知一个负数的补码,可以对该补码再进行求补码(即一个数的补码的补码)即可得到该数的原码,即[[X]补]补=[X]原,而求出真值。

例如,已知:[N2]补=10010111B

[N2]原=[[N]补]补=11101000B+1=11101001B

可得真值:N2=−105

【例1-2】已知数据A1、A2、A3、A4在存储单元以补码存储,形式分别为:10000001B 11111111B、10000010B、11111110B,求A1、A2、A3、A4的真值。

由于补码的最高位为1,表示负数,必须求出原码才能求其真值,故有:

978-7-111-53315-3-Chapter01-40.jpg

对采用补码形式表示的数据进行运算时,可以将减法转换为加法。可以证明,补码加减法的运算规则为

978-7-111-53315-3-Chapter01-41.jpg

其中X,Y为正负数均可,符号位参与运算

例如,设X=10,Y=20,求X−Y。

X−Y可表示为X+(−Y),即10+(−20)。

978-7-111-53315-3-Chapter01-42.jpg

则有

978-7-111-53315-3-Chapter01-43.jpg

再对[X+(−Y)]补求补码可得[X+(−Y)]原,即

[X+(−Y)]原=10001001B+1=10001010B

则X−Y的真值为−10D。

【例1-3】计算−7+3。

(−7)补码=11111001B

(+3)补码=00000011B

则运算如下:

978-7-111-53315-3-Chapter01-44.jpg

对结果11111100求补:10000011+1=10000100(原码),即-4。

必须指出:所有负数在计算机中都是以补码形式存放的,补码表示仅为负数时才与原码有所不同。采用补码表示的n位二进制有符号整数的有效范围是:−2n−1~2n−1−1。

计算机在运算过程中,结果超出此允许范围,则称为发生溢出,即运算结果错误。

应当注意:对于8位二进制数,作为补码形式,它所表示的范围为:−27~27−1(即−128~127);而作为无符号数,它所表示的范围为:0~28−1即(0~255)。对于16位二进制数,作为补码形式,它所表示的范围为:−215~215−1(−32768~32767);而作为无符号数,它所表示的范围为:0~216−1(即0~65535)。所以,计算机中存储的任何一个数据,由于解释形式的不同,所代表的意义也不同。在编写汇编语言程序时,首先要确定数据的编码形式,然后按编码形式编写处理程序。因为计算机在执行程序时并不直接理解人们设置的编码,只是按照指令的功能对其进行运算和处理。

例如,某计算机存储单元的数据为84H,其对应的二进制数表现形式为10000100B,对于不同的编码,具有不同的含义。

1)该数若解释为无符号数编码,其真值为132。

2)该数若解释为有符号数编码,最高位为1可确定为负数的补码表示,则该数的原码为11111011B+1B=11111100B,其真值为124。

3)该数若解释为BCD编码,其真值为84D。

3.二-十进制编码

二-十进制编码又称BCD编码,这种编码形式既具有二进制数的形式,以便于存储,又具有十进制数的特点,以便于进行运算和显示结果。在BCD码中,用4位二进制代码表示1位十进制数。

常用的8421BCD码的对应编码见表1-5。

例如,将27转换为8421BCD码:

978-7-111-53315-3-Chapter01-45.jpg

将105转换为8421BCD码

978-7-111-53315-3-Chapter01-46.jpg

1-5 十进制编码(8421BCD

978-7-111-53315-3-Chapter01-47.jpg

因为8421BCD码中只能表示0000B~1001B(0~9)这十个代码,不允许出现代码1010B~1111B(因其值大于9),因而,计算机在进行BCD加法(即二进制加法)的过程中,若和的低四位大于9(即1001B)或低四位向高四位有进位时,为保证运算结果的正确性,低四位必须进行加6修正。同理,若和的高四位大于9(即1001B)或高四位向更高四位有进位时,为保证运算结果的正确性,高四位必须进行加6修正。

例如:

978-7-111-53315-3-Chapter01-48.jpg

17+24=41在计算机中的操作为

978-7-111-53315-3-Chapter01-49.jpg

4.ASCII编码 前面介绍的是计算机中的数值型数据的编码,对于文字、符号、图像、声音等非数值信息在计算机中也必须以二进制数的形式存放在计算机存储器中。

这里仅介绍对于键盘字符型数据的ASCII编码。

美国标准信息交换码(American Standard Code for Information,ASCII)是一种国际标准信息交换码,它利用7位二进制代码来表示字符,再加上1位校验位,故在计算机中用1个字节8位二进制数来表示一个字符,这样有利于对这些数据进行处理及传输。

例如,键盘输入的十进制数字“0”“1”…“9”符号(不是指数值),26个大小写英文字母,键盘控制符号“CR”(回车)等,这些符号在由键盘输入时不能直接装入计算机,必须将其转换为特定的二进制代码(即将其编码),以二进制代码所表示的字符数据的形式装入计算机。

常用字符的ASCII码表示见表1-6

1-6 常用字符的ASCII

978-7-111-53315-3-Chapter01-50.jpg

ASCII码表见附录A。

英文字母A~Z的ASCII码从1000001(41H)开始顺序递增,字母a~z的ASCII码从1100001(61H)开始顺序递增,这样的排列对信息检索十分有利。

如字符A的ASCII码为41H(65);字符B的ASCII码为42H(66)。

数字0~9的编码是0110000B~0111001B,它们的高3位均是011,后4位正好与其对应的二进制数代码相同。如:字符1的ASCII码为31H(49);字符2的ASCII码为32H 50)。

〈Enter〉键(回车)的ASCII码为0DH(13)。

1.2.4数的定点和浮点表示

计算机中运算的数有整数,也有小数。在计算机中,小数通常有两种规定:一种是规定小数点的位置固定不变,这时的机器数称为定点数;另一种是小数点的位置可以浮动,这时的机器数称为浮点数。微型计算机多使用定点数。

1.定点数 定点数是指计算机中数的小数点位置是固定不变的。根据小数点位置的固定方法不同,又可分为定点整数及定点小数表示法。前面所介绍的整数均为定点整数,可以认为小数点固定在数的最低位之后。

(1)定点整数

如果小数点隐含固定在整个数值的最右端,符号位右边所有的位数表示的是一个整数,即为定点整数。例如,对于16位计算机,如果符号位占1位,数值部分占15位,于是机器数为0111111111111111的等效十进制数为+32767,其符号位、数值部分、小数点的位置示意如图1-13所示。

978-7-111-53315-3-Chapter01-51.jpg

图1-13 定点整数的符号位、数值部分和小数点位置示意图

2)定点小数

如果小数点隐含固定在数值的某一个位置上,即为定点小数

如果小数点固定在符号位之后,即为纯小数。假设机器字长为16位,符号位占1位,数值部分占15位,于是机器数1.000000000000001的等效的十进制数为−2−15。其符号位、数值部分、小数点的位置示意如图1-14所示。

978-7-111-53315-3-Chapter01-52.jpg

图1-14 纯小数的符号位、数值部分和小数点的位置示意图

2.浮点数

所谓浮点数,是指计算机中数的小数点位置不是固定的,或者说是“浮动”的。在计算机中,浮点数法一般用来表示实数,可以采用“阶码表示法”来表示浮点数,它由整数部分和小数部分组成,一个实数可以表示成一个纯小数和一个乘幂之积。

采用浮点数最大的特点是比定点数表示的数值范围大。

例如,对于十进制数56.725=102×0.56725;对于二进制数110.11=22×1.1011

对于任何一个二进制数N,都可表示为:

N=(2±E)×(±S)

浮点数在计算机中的编码基本格式为:

978-7-111-53315-3-Chapter01-53.jpg

其中E称为阶码,阶符为0表示E为正、为1表示E为负。由此可知,小数点的实际位置随着阶码E的大小和符号而浮动决定;±S为全部有效数据,称为尾数部分。

例如:1001.011=20100×(0.1001011)

在这里,0100部分称为阶码且为正,(0.1001011)部分称为尾数。

浮点数的格式多种多样,例如,某计算机用4字节表示浮点数,阶码部分为8位补码定点整数,尾数部分为24位补码定点小数,如图1-15所示。

其中,阶符表示指数的符号位;阶码表示幂次;数符表示尾数的符号位;尾数表示规格化后的小数值。

978-7-111-53315-3-Chapter01-54.jpg

图1-1532位浮点数的格式

【例1-4】描述用4字节存放十进制浮点数“136.5”的浮点格式。

由于(136.5)10=(10001000.1)2,将二进制数“10001000.1”进行规格化,即

10001000.1=0.100010001×28

阶码28表示阶符为“+”,阶码“8”的二进制数为“0001000”;尾数中的数符为“+”,小数值为“100010001”。

十进制小数“136.5”在计算机中的表示如图1-16所示。

978-7-111-53315-3-Chapter01-55.jpg

图1-16规格化后的浮点数

在实际应用时,由于阶码指数可选用不同的编码(原码、补码等),尾数的格式和小数点的位置也可以有不同的规定,所以,浮点数的表示方法不唯一,不同的计算机可以有不同的规定,这就出现了数据格式的不兼容问题。为此,IEEE制定了有关工业标准,并为大多厂家所接受。

Pentium处理器中的浮点数据格式完全符合IEEE标准,它表示为如下形式。

(−1)S2E(b0⊿b1b2b3…bp−1)

其中,(−1)S是该数的符号位,S=0表示此数为正,S=1表示此数为负;E是指数,它是一个带偏移量的整数,表示成无符号整数;(b0b1b2b3…bp−1)是尾数,其中bi=0或1,“ 978-7-111-53315-3-Chapter01-56.jpg ”代表隐含的小数点;P是尾数的长度,它表示尾数共P位。

Pentium微处理器中的浮点数有3种表示格式,分别为单精度浮点数(32位)、双精度浮点数(64位)、扩充精度浮点数(80位)。它一般都表示成规格化形式,即尾数的最高位b0总是1,且它和小数点一样隐含存在,在机器中不明确表示出来。

在Pentium微处理器中,单精度浮点数的表示形式如图1-17所示。

978-7-111-53315-3-Chapter01-57.jpg

图1-17 Pentium微处理器单精度浮点数