计算机原理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第1章 数字设备中数和字符的表示方法

本章要点:

► 掌握微型计算机的特点和用途;

► 掌握数字设备中数的表示方法和各种进制间数的转换方法;

► 掌握原、补、反码的概念;

► 初步掌握数字设备中常用的编码。

在当今的工作、学习和生活中,随处可见数字设备的存在。由于计算机,特别是微型计算机已经融入人们中间,往往会使初学者认为数字设备就是计算机。鉴于此,在学习本课程前再重申两点:

► 计算机是数字设备的一种,它有数字设备的基本属性,但又有其鲜明的特点;

► 在数字设备中,0和1是基本元素,与、或、非是基本运算,组合(逻辑)电路和时序(逻辑)电路是基本表现形式。

1.1 微型计算机概述

微型计算机是20世纪70年代初期发展起来的。它的产生、发展和壮大及对国民经济的巨大作用引起人们的高度重视,它使人类社会发生翻天覆地的变化。

随着微型计算机的高速发展,单片微型计算机、单板微型计算机、微型计算机系统、微型计算机开发系统和计算机网络工作站等新机种不断涌现。为了掌握好微型计算机,从概念上弄清微型计算机和这些新机种之间的异同是十分重要的,读者应予重视。

1.1.1 微型计算机的特点和发展

电子计算机通常按体积、性能和价格分为巨型机、大型机、中型机、小型机和微型计算机5类。从系统结构和基本工作原理上说,微型计算机和其他几类计算机并没有本质上的区别,所不同的是微型计算机广泛采用集成度相当高的器件和部件,因此带来以下所述的一系列特点。

1.体积小,重量轻

由于采用大规模集成电路(LSI)和超大规模集成电路(VLSI),使微型计算机所含的器件数目大为减少,体积大为缩小。对于20世纪50年代要由占地上百平方米,耗电上百千瓦的电子计算机实现的功能,当今,内部只含几十片集成电路的微型计算机即已具备。

2.价格低廉

如今的微型计算机价格不断下降,而性能却迅速提高。在我国,许多家庭已经或正在筹划购置微型计算机。微型计算机进入家庭的时代已经到来。

3.可靠性高,结构灵活

由于内部元器件数目少,所以连线比较少,这样,使微型计算机的可靠性较高,结构灵活方便。

4.应用面广

现在,微型计算机不仅占领了原来使用小型机的各个领域,而且广泛应用于过程控制等新的场合。此外,微型计算机还进入了过去电子计算机无法进入的领域,如测量仪器、仪表、教学部门、医疗设备及家用电器等。

由于微型计算机具有上面这些特点,所以它的发展速度大大超过了前几代计算机。自从20世纪70年代初第一个微处理器诞生以来,微处理器的性能和集成度几乎每两年提高一倍,而价格却降低一半。

第一个微处理器是1971年美国Intel公司生产的Intel 4004。

以后,出现了许多生产微处理器的厂家。1973~1977年间,这些厂家生产了多种型号的微处理器,其中设计最成功、应用最广泛的是Intel公司的8080/8085,Zilog公司的Z80,Motorola公司的6800/6802及Rockwell公司的6502。通常,人们把它们称为第二代微处理器。在这个时期,微处理器的设计和生产技术已相当成熟,配套的各类器件也很齐全。后来,微处理器在以下几个方面得到很大发展:提高集成度,提高功能和速度,以及增加外围电路的功能和种类。

1978~1979年,一些厂家推出了性能可与过去中档小型计算机相比的16位微处理器。这中间,有代表性的3种芯片是Intel的8086/8088,Zilog的Z8000,以及Motoro1a的MC 68000。人们将这些微处理器称为第一代超大规模集成电路的微处理器。

1980年以后,半导体生产厂家继续在提高电路的集成度、速度和功能方面取得了很大进展,相继出现Intel 80286、Motoro1a 68010等16位高性能微处理器。1983年以后,又生产出Intel 80386和Motorola 68020。这两者都是32位的微处理器。

1993年,Intel推出Pentium微处理器,接着是Pentium MMX(带多媒体指令的Pentium微处理器)、Pentium Pro、 Pentium II和Pentium III相继问世。Pentium III的主频可达450 MHz以上,增加了浮点运算、并行处理、图像处理和连接因特网的功能。最新推出的Pentium IV微处理器的主频已达1.7 GHz以上。

1.1.2 微型计算机的分类

人们可以从不同的角度对微型计算机进行分类。有人按机器组成来分,将微型计算机分为位片式、单片式和多片式;有人按制造工艺来分,将微型计算机分为MOS型和双极型。由于微型计算机性能的高低在很大程度上取决于核心部件微处理器,所以,最通常的做法是把微处理器的字长作为微型计算机的分类标准。

当前,可以见到由以下几类微处理器构成的微型计算机。

1.4位微处理器

最初的4位微处理器就是Intel 4004,后来改进为4040。目前常见的是4位单片微型计算机,即在一个芯片内集中了4位的CPU,RAM,ROM,I/O接口和时钟发生器。这种单片机价格低廉,但运算能力弱,存储容量小,存储器中只存放固定程序。这些特点使它们广泛用于各类袖珍计算器中进行简单的运算,或者用于家用电器和娱乐器件中进行简单的过程控制。

2.8位微处理器

8位微处理器推出时,微型计算机技术已经比较成熟。因此,在8位微处理器基础上构成的微型计算机系统,通用性较强,它们的寻址能力可以达到64 KB,有功能灵活的指令系统和较强的中断能力。另外,8位微处理器有比较齐备的配套电路。这些因素使8位微型计算机的应用范围很宽,可广泛用于事务管理、工业控制、教育及通信等行业。8位微处理器也常用来构成智能终端,而8位微型计算机则被许多家庭用做学习机和个人计算机。

常见的8位微处理器有Zilog的Z80,Intel的8080/8085,Motorola 6800/6802和Rockwell 6502。由这些微处理器构成的微型计算机在国内占有相当数量。

3.16位微处理器

16位微处理器不仅在集成度、处理速度和数据总线宽度等方面优于前几类微处理器,而且在功能和处理方法上也做了改进。在此基础上构成的微型计算机系统,在性能方面已经和20世纪70年代的中档小型计算机相当。

16位微处理器中最有代表性的是Intel 8086/8088和Motorola 68000。以Intel 8086/8088为CPU的16位微型计算机IBM PC/XT是目前的主流机型,它拥有的用户在计算机世界首屈一指,以至于在设计更高档的微型计算机时,都尽量保持对它兼容。

4.32位微处理器

32位微处理器是当前性能最优的微处理器,典型产品为Intel 80386,Motorola MC68020。它们的主频率高达20~40 MHz,平均指令执行时间为0.05 μs。近两年,32位微型计算机已投入使用,但由于价格还比较高,因此,一般作为工作站进行计算机辅助设计、工程设计,或者作为微型计算机局域网中的资源站点。

除此以外,还有一类叫位片式处理器,利用这类微处理器,可以构成不同字长的微型计算机。位片机结构灵活,主要用于对中、小型计算机的仿真,或者用于高速实时控制专用系统中,也常用在分布式系统和高速智能外设中。

1.1.3 微型计算机的应用

1.科学计算

科学计算一直是电子计算机的重要应用领域之一。例如,在天文学、量子化学、空气动力学及核物理学等领域中,都需要依靠计算机进行复杂的运算。在军事上,导弹的发射和飞行轨道的计算控制,以及先进防空系统等现代化军事设施,通常都是由计算机控制的大系统,其中包括雷达、地面设施和海上装备等。现代的航空、航天技术的发展,例如超音速飞行器的设计,人造卫星与运载火箭轨道的计算等,更离不开计算机。

除了国防及尖端科学技术以外,计算机在其他学科和工程设计方面,诸如数学、力学、晶体结构分析、石油勘探、桥梁设计、建筑及土木工程设计等领域,也得到广泛的应用,促进了各门科学技术的发展。

有些系统,要求计算机处理所得的结果立即反过来作用或影响正在被处理的事物本身。例如,在控制导弹飞行的系统中,通过不断测量导弹飞行的参数(包括飞行环境),并及时做出反应,以不断地修正导弹飞行的姿态与轨道,这样的系统称为实时处理系统。

科学计算的特点是计算量大和数值变化范围大。

2.信息处理和事务管理

在短时间内完成对大量信息的处理是进入信息时代的必然要求。微型计算机配上数据库管理软件以后,可以很灵活地对各种信息按不同的要求进行分类、检索、转换、存储和打印,加上一些专用部件(如传感器)以后,还可以处理光、热、力和声音等物理信号。

3.过程控制

过程控制是微型计算机应用最多,也是最有效的方面之一。现在,制造工业和日用品生产厂家中都可见到微型计算机控制的自动化生产线。微型计算机在这些部门的应用为生产能力和产品质量的迅速提高开辟了广阔的前景。

4.仪器、仪表控制

在许多仪器、仪表中,已经用微处理器代替传统的机械部件或分立的电子部件,这使产品降低了价格,而可靠性和功能却得到了提高。此外,微处理器的应用还导致了一些原来没有的新仪器的诞生。在实验室里,出现了用微处理器控制的示波器——逻辑分析仪,它使电子工程技术人员能够用以前不可能采用的办法同时观察许多信号的波形和相互之间的时序关系。在医学领域中,出现了用微处理器作为核心控制部件的CT扫描仪和超声波扫描仪,增加了疾病的诊断手段。

5.家用电器和民用产品控制

由微处理器控制的洗衣机、电冰箱,现在已经是很普通的民用电器了。此外,微处理器控制的自动报时、自动调温及自动报警系统也已经进入发达国家的家庭。还有,装有微处理器的娱乐产品往往将智能功能融于娱乐中;以微处理器为核心的盲人阅读器则能自动扫描文本,并读出文本的内容,从而为盲人带来福音。确切地讲,微处理器在人们日常生活中的应用所受到的主要限制不是技术问题,而是创造力和技巧上的问题。

当前,微型计算机技术正往两个方向发展:一个是高性能、高价格的方向,从这方面不断取得的成就可能使微型计算机代替价格昂贵、功能优越的巨型机;另一个是价格低廉、功能专一的方向,这方面的发展使微型计算机在生产领域、服务部门和日常生活中得到越来越广泛的应用。

6.计算机辅助设计/计算机辅助制造(CAD/CAM)

由于计算机有快速的数值计算、较强的数据处理以及模拟的能力,因而目前在飞机、船舶、光学仪器及超大规模集成电路(VLSI)等的设计制造过程中,CAD/CAM占据着越来越重要的地位。

在超大规模集成电路的设计和生产过程中,要经过设计制图、照相制版、光刻、扩散和内部连接等多道复杂工序,这是人工难以解决的。

使用已有的计算机,辅助设计新的计算机,达到设计自动化或半自动化程度,从而减轻人的劳动强度并提高设计质量,这也是计算机辅助设计的一项重要内容。

由于设计工作与图形制作密不可分,一般供辅助设计用的计算机都配备图形显示、绘图仪等设备,以及图形库、图形制作软件等。设计人员可借助这些专用软件和输入/输出设备把设计要求或方案输入计算机,并通过相应的应用程序进行计算处理后把结果显示出来。设计人员可用光笔或鼠标器进行修改或选择,直到满意为止。

7.人工智能

人类的许多脑力劳动,诸如证明数学定理,进行常识性推理,理解自然语言,诊断疾病,下棋游戏及破译密码等都需要“智能”。

人工智能学科研究的主要内容包括:知识表示,自动推理和搜索方法,机器学习和知识获取,知识处理系统,自然语言理解,计算机视觉及智能机器人等。

1.2 数和数制

迄今为止,所有计算机都是以二进制形式进行算术运算和逻辑操作的,微型计算机和其他数字设备也不例外。因此,用户在键盘上输入的十进制数字和符号命令,微型计算机都必须先把它们转换成二进制形式进行识别、运算和处理,然后再把运算结果还原成十进制数字和符号在输出设备(如CRT)上显示出来。

虽然上述过程十分烦琐,但都是由微型计算机自动完成的。为了使读者最终弄清机器的这一工作机理,这里先对微型计算机中常用的数制和数制间数的转换进行讨论。

1.2.1 各种数制及其表示法

所谓数制指的是数的制式,是人们利用符号计数的一种科学方法。数制是人类在长期的生存斗争和社会实践中逐步形成的。数制有很多种,微型计算机中常用的数制有十进制、二进制和十六进制3种。

1.十进制(Decimal)

十进制是大家很熟悉的进位计数制,它共有0,1,2,3,4,5,6,7,8和9这10个数字符号。这10个数字符号又称为数码,每个数码在数中最多可表示两种含义的值。例如,十进制数45中的数码4,其本身的值为4,但它实际代表的值为40。在数学上,数制中数码的个数定义为基数,故十进制的基数为10。

十进制是一种科学的计数方法,它所能表示的数的范围很大。十进制数通常具有如下两个主要特点。

它有0~9十个不同的数码,这是构成所有十进制数的基本符号。

它是逢10进位的。十进制数在计数过程中,当它的某位计满10时就要向它邻近的高位进1。

因此,任何一个十进制数不仅和构成它的每个数码本身的值有关,而且还和这些数码在数中的位置有关。这就是说,任何一个十进制数都可以展开成幂级数形式。例如:

123.45=1×102+2×101+3×100+4×10-1+5×10-2

式中:指数102,101,100,10-1和10-2在数学中称为权,10为它的基数;整数部分中每位的幂是该位位数减1;小数部分中每位的幂是该位小数的位数。

一般地说,任意一个十进制数N均可表示为:

式中:i表示数中任一位,是一个变量;ai表示第i位的数码;n为该数整数部分的位数;m为小数部分的位数。

2.二进制(Binary)

二进制比十进制更为简单,它是随着计算机的发展而兴旺起来的。二进制数也有如下两个主要特点。

它共有0l两个数码,任何二进制数都是由这两个数码组成的。

二进制数的基数为2,它奉行逢21的进位计数原则。

因此,二进制数同样也可以展开成幂级数形式,不过内容有所不同罢了。例如:

10110.11=1×24+0×23+1×22+1×21+0×20+1×2-1+1×2-2

=1×24+1×22+1×21+1×2-1+1×2-2

=[22.75]10

式中,指数24,23,22,21,20,2-1和2-2为权,2为基数,其余和十进制数相同。

为此,任何二进制数N的公式为:

式中,ai为第i位数码,可取0或1;n为该二进制数整数部分的位数;m为小数部分的位数。

3.十六进制(Hexadecimal

十六进制是人们学习和研究计算机中二进制数的一种工具,它是随着计算机的发展而广泛应用的。十六进制数也有两个主要特点。

它有0,1,2,…,9,A,B,C,D,E,F16个数码,任何一个十六进制数都是由其中的一些或全部数码构成的。

十六进制数的基数为16,进位计数为逢161

十六进制数也可展开成幂级数形式。例如:

70F.B1=7×162+0×161+F×160+B×16-l+1×16-2=[1807.691 4]10

其通式为:

式中,ai为第i位数码,取值为0~F中的一个;n为该数整数部分的位数;m为小数部分的位数。

为方便起见,现将部分十进制、二进制和十六进制数的对照表列于表1.1中。

表1.1 部分十进制、二进制和十六进制数的对照表

在阅读和书写不同数制的数时,如果不在每个数上外加一些辨认标记,就会混淆而无法分清。通常,标记方法有两种:一种是把数加上方括号,并在方括号右下角标注数制代号,如[101]16、[101]2和[101]10分别表示十六进制、二进制和十进制数;另一种是用英文字母标记,加在被标记数的后面,分别用大写字母B、D和H表示二进制、十进制和十六进制数,如89H为16进制数,101B为二进制数等。其中,十进制数中的D标记也可以省略。另外,在书写十六进制数时,若最高位是字母时,则必须在其前面加0,以免与英文单词混淆。例如:F9H应写成0F9H。

在微型计算机内部,数的表示形式是二进制的。这是因为二进制数只有0和1两个数码,人们采用晶体管的导通和截止,脉冲的高电平和低电平等,就能很容易地表示它。此外,二进制数运算简单,便于用电子线路实现。

人们采用十六进制数可以大大减轻阅读和书写二进制数时的负担。例如:

11011011B=0DBH

1001001111110010B=93F2H

显然,采用十六进制数描述一个二进制数特别简短,尤其在被描述二进制数的位数较长时,更令计算机工作者感到方便。

1.2.2 各种数制间数的相互转换

微型计算机是采用二进制数操作的,但人们习惯于使用十进制数,这就要求机器能自动对不同数制的数进行转换。这里暂且不讨论微型计算机是如何进行这种转换的,先来看看数学上是如何进行上述3种数制间数的转换的。3种数制间数的转换方法示意图如图1.l所示。

图1.1 3种数制间数的转换方法示意图

1.二进制数和十进制数之间的转换

(1)二进制数转换成十进制数

只要把欲转换数按权展开后相加即可。也可以从小数点开始每4位1组,然后按16进制的权展开并相加。例如:

11010.01B=1×24+1×23+1×21+1×2-2=26.25

或者11010.01B=1A.4H=1×161+10×160+4×16-1=26.25

(2)十进制数转换成二进制数

本转换过程是上述转换过程的逆过程。但十进制整数和小数转换成二进制的整数和小数的方法是不相同的,下面分别进行介绍。

① 十进制整数转换成二进制整数的方法有很多种,但最常用的是“除2逆取余法”。

“除2逆取余法”的法则是:用2连续去除要转换的十进制数,直到商小于2为止,然后把各次余数按最后得到的为最高位,最早得到的为最低位依次排列起来,所得到的数便是所求的二进制数。现举例加以说明。

【例1.1】 试求出十进制数215的二进制数

解:把215连续除以2,直到商数小于2为止。相应竖式为:

把所得余数按箭头方向从高到低排列起来便可得到:

215=11010111B

② 十进制小数转换成二进制小数通常采用“乘2顺取整法”。

“乘2顺取整法”的法则是:用2连续去乘要转换的十进制小数,直到所得乘积的小数部分为0或满足所需精度为止,然后把各次整数按最先得到的为最高位,最后得到的为最低位,依次排列起来,所对应的数便是所求的二进制小数。现结合实例加以介绍。

【例1.2】 试把十进制小数0.687 9转换为二进制小数

解:把0.687 9不断地乘以2,取每次所得乘积的整数部分,直到乘积的小数部分满足所需精度为止。其相应的竖式是:

把所得整数按箭头方向从高到低排列后得到:

0.6879D≈0.1011B

对同时有整数和小数两部分的十进制数,在将其转换成二进制数时,可以把它的整数和小数部分分别转换后,再合并起来。例如,把例1.1和例1.2合并起来便可得到:

215.6879≈11010111.1011B

应当指出,任何十进制整数都可以精确地转换成一个二进制整数,但任何十进制小数却不一定可以精确地转换成一个二进制小数。例1.2中的情况就是一例。

2.十六进制数和十进制数之间的转换

(1)十六进制数转换成十进制数

方法和二进制数转换成十进制数的类似,即可把十六进制数按权展开后相加。例如:

3FEAH=3×163+15×162+14×161+10×160=16362

(2)十进制数转换成十六进制数

① 十进制整数转换成十六进制整数的方法和十进制整数转换成二进制整数的方法类似。十进制整数转换成十六进制整数可以采用“除16逆取余法”。

“除16逆取余法”的法则是:用16连续去除要转换的十进制整数,直到商数小于16为止,然后把各次余数按逆次序排列起来,所得的数便是所求的十六进制数。

【例1.3】 3901所对应的十六进制数

解:把3901连续除以16,直到商数为小于16为止。相应竖式为:

∴ 3901=0F3DH

② 十进制小数转换成十六进制小数的方法类似于十进制小数转换成二进制小数,常采用“乘16顺取整法”。

“乘16顺取整法”的法则是:把欲转换的十进制小数连续乘以16,直到所得乘积的小数部分为0或达到所需精度为止,然后把各次乘积的整数按相同次序排列起来,所得的数便是所求的十六进制小数。

【例1.4】 0.76171875的十六进制数。

解:把0.76171875连续乘以16,直到所得乘积的小数部分为0。相应竖式为:

∴ 0.76171875=0.C3H

3.二进制数和十六进制数之间的转换

二进制数和十六进制数之间的转换十分方便,这就是为什么人们要采用十六进制数形式来表达二进制数的内在原因。

① 二进制数转换成十六进制数:可采用“4位合1位法”。

“4位合1位法”的法则是:从二进制数的小数点开始,分别向左向右每4位1组,不足4位的以0补足,然后分别把每组数用十六进制数码表示,并按序相连。

【例1.5】 1101111100011.10010100B转换为十六进制数。

解:

∴ 1101111100011.10010100B=1BE3.94H

② 十六进制数转换成二进制数:可采用“1位分4位法”。

“1位分4位法”的法则是:把十六进制数的每位分别用4位二进制数码表示,然后把它们连成一体。

【例1.6】 把十六进制数3AB.7A5H转换为二进制数

解:

∴ 3AB.7A5H=1110101011.011110100101B

1.2.3 二进制数的运算

在微型计算机中,经常碰到的运算分为两类:一类是算术运算,另一类是逻辑运算。在算术运算中,可以对无符号数或有符号数进行加、减、乘、除运算;逻辑运算有逻辑乘、逻辑加、逻辑非和逻辑异或等。现分别加以介绍。

算术运算

(1)加法运算

二进制数加法法则为:

0+0=0

1+0=0+1=1

1+1=10(向邻近高位有进位)

1+1+1=11(向邻近高位有进位)

两个二进制数的加法过程和十进制数的加法过程类似,现举例加以说明。

【例1.7】 设两个8位二进制数X=10110110B, Y=11011001B, 试求出X+Y的值。

解:X+Y可写成如下竖式:

X + Y=10110110B + 11011001B=110001111B

两个二进制数相加时要注意低位的进位,且两个8位二进制数的和最大不会超过9位。

(2)减法运算

二进制数减法法则为:

0-0=0

1-1=0

1-0=1

0-1=1(向邻近高位借1当做2)

两个二进制数的减法运算过程和十进制数的减法类似,现举例进行说明。

【例1.8】 设两个8位二进制数 X=10010111B,Y=11011001B,试求X-Y之值。

解:由于YX,故有X-Y=-(Y-X),相应竖式为:

X-Y=10010111B-11011001B=-01000010B

两个二进制数相减时先要判断它们的大小,把大数作为被减数,小数作为减数,差的符号由两数关系决定。此外,在减法运算过程中还要注意低位向高位借1应看做2。

(3)乘法运算

二进制数乘法法则为:

0×0=0

1×0=0×1=0

1×1=1

两个二进制数相乘与两个十进制数相乘类似。可以用乘数的每一位分别去乘被乘数,所得结果的最低位与相应乘数位对齐,最后把所有结果加起来,便得到积,这些中间结果又称为部分积。

【例1.9】 设两个 4 位二进制数X=1101B Y=1011B,试用手工算法求出X×Y之值。

解:二进制数乘法运算竖式为:

X×Y=1101B×1011B=10001111B

(4)除法运算

除法是乘法的逆运算。与十进制数类似,二进制数除法也是从被除数最高位开始的。其过程是先查找出够减除数的位数,在其最高位处上商1并完成它对除数的减法运算,然后把被除数的下一位移到余数的位置上。若余数不够减除数,则上商0,并把被除数的再下一位移到余数的位置上;若余数够减除数,则上商1,余数减除数。这样反复进行,直到全部被除数的各位都下移到余数位置上为止。

【例1.10】 X=10101011B,Y=110B,试求X÷Y之值。

解:X÷Y的竖式是:

X÷Y=10101011B÷110B=11100B …… 余11B

1.2.4 逻辑运算

计算机处理数据时常常要用到逻辑运算,逻辑运算是由专门的逻辑电路完成的。下面介绍几种常用的逻辑运算。

1.逻辑乘运算

逻辑乘又称逻辑与,常用运算符“∧”表示。逻辑乘的运算规则为:

0∧0=0

1∧0=0∧1=0

1∧1=1

两个二进制数进行逻辑乘运算,其方法类似二进制数的算术运算。

【例1.11】 已知X=01100110B,Y=11110000B,试求XY之值。

解:XY的运算竖式为:

XY=01100110B∧11110000B=01100000B

2.逻辑加运算

逻辑加又称逻辑或,常用运算符“∨”表示。逻辑加的运算规则为:

0∨0=0

1∨0=0∨1=1

1∨1=1

【例1.12 已知X=00110101B,Y=00001111B,试求XY之值。

解:XY的运算竖式为:

XY=00110101B∨00001111B=00111111B

3.逻辑非运算

逻辑非运算又称逻辑取反,常采用运算符“-”表示。逻辑非的运算规则为:

0-=1

1=0

【例1.13】 已知X=11000011B,试求X-之值。

X =11000011B

X-=00111100B

4.逻辑异或运算

逻辑异或运算又称为半加,是不考虑进位的加法,常采用运算符“⊕”表示。逻辑异或的运算规则为:

0⊕0=1⊕1=0

1⊕0=0⊕1=1

【例1.14】 已知X=10110110B,Y=11110000B,试求XY的值。

解:XY的运算竖式为:

XY=10110110B⊕11110000B=01000110B

1.3 有符号二进制数的表示方法及溢出问题

1.3.1 有符号二进制数的表示方法

计算机内的数分为无符号数和有符号数。无符号数可以理解为正整数,有符号数可表示正数和负数。计算机中,为便于识别,需将有符号数的正、负号数字化。通常的做法是用一位二进制数表示符号,称为“符号位”,放在有效数字的前面,用“0”表示正,用“1”表示负。有符号的二进制数在计算机中有3种表示形式:原码、反码和补码。下面的讨论中假定字长为8位。

1.原码、反码和补码的表示方法

(1)原码

在数值的前面直接加一符号位的表示法称为原码表示法。例如,数+7和-7的原码分别为:

                    符号位  数值位
            [+7]=  0   0000111
            [-7]=  1   0000111

在这种表示法中,数0的原码有两种形式,即:

            [+0]=00000000   [-0]=10000000

若字长为8位,则原码的表示范围为-127~+127;若字长为16位,则原码的表示范围为-32767~+32767。

(2)反码

正数的反码与原码相同;负数的反码,符号位仍为“1”,数值部分“按位取反”。例如,+7和-7的反码分别为:

            [+7]=00000111B=07H
            [-7]=11111000B=F8H

在这种表示法中,数0的反码也有两种形式,即:

            [+0]=00000000=00H   [-0]=11111111=FFH

字长为8位和16位时,反码的表示范围分别为-127~+127和-32767~+32767。

(3)补码

① 模的概念:把一个计量单位称之为模或模数,用M表示。例如,时钟以12为计数循环,即以12为模。在时钟上,时针加上(正拨)12的整数倍或减去(反拨)12的整数倍,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟。从0点出发逆时针拨10格即减去10 h,也可看成从0点出发顺时针拨2格(加上2h),即2点。因此,在模12的前提下,-10可映射为+2。再如在讨论三角函数时以360°为计数循环,即410°-360°=50°。现实中还有许多以模为计数单位的例子。

计算机的运算部件与寄存器都有一定字长的限制,因此它的运算也是一种模运算。例如,一定位数的计数器,在计满后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模。如8位二进制数,它的模数为28=256。

由此可以看出,对于一个模数为12的循环计数系统来说,加2和减10的效果是一样的。因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了。10和2对模12而言互为补数,在计算机中称为“补码”。

② 补码的表示:在补码表示法中,正数的补码与原码相同;负数的补码则是符号位为“1”,数值部分按位取反后再在末位(最低位)加1。

例如,+7和-7的补码分别为:

            [+7]补=00000111B=07H
            [-7]补=11111001B=F9H

补码在微型计算机中是一种重要的编码形式,请注意如下事项。

注意

a. 采用补码后,可以方便地将减法运算转化为加法运算,运算过程得到简化。因此,计算机中有符号数一般采用补码表示。

b. 正数的补码即是它所表示的数的真值,而负数补码的数值部分却不是它所表示的数的真值。

c. 采用补码进行运算,所得结果仍为补码。为了得到结果的真值,还得进行转换(还原)。转换前应先判断符号位,若符号位为0,则所得结果为正数,其值与真值相同;若符号位为1,则应将它转换成原码,然后得到它的真值。

d. 与原码、反码不同,数值0的补码只有一个,即[0]=00000000B=00H

e. 若字长为8位,则补码所表示的范围为-128~+127;若字长为16位,则补码所表示的范围为-32768~+32767

f. 进行补码运算时,应注意所得结果不应超过上述补码所能表示数的范围,否则会产生溢出而导致错误。采用其他码制运算时,同样应注意这一问题。

2.原码、反码和补码之间的转换

由于正数的原码、反码和补码表示方法相同,因此不存在转换问题。下面仅分析负数的原码、反码和补码之间的转换。

(1)已知原码,求补码

【例1.15】 已知某数X的原码为10110100B,试求X的补码。

解:由[X]=10110100B知,X为负数。求其补码表示时,符号位不变,数值部分按位求反,再在末位加1。

∴[X]=11001100B

(2)已知补码,求原码

【例1.16】 已知某数X的补码为11101110B,试求其原码。

解:由[X]=11101110B知,X为负数。求其原码表示时,符号位不变,数值部分按位求反后,再在末位加1。

∴[X]=10010010B

说明:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍采用取反加1的方法。

(3)求补(已知[X],求[-X]的过程称为求补)

所谓求补,就是将[X]的所有位(包括符号位)一起逐位取反,然后在末位加1,即可得到-X的补码,即[-X]。不管X是正数还是负数,都应按该方法操作。

【例1.17】 试求+97、-97的补码。

解:+97=01100001,于是[+97]=01100001

求[-97]的方法是:

(4)已知补码,求对应的十进制数

【例1.18】 已知某数X的补码为10101011B,试求其所对应的十进制数。

解:该补码最高位(符号位)为1,因此它表示的是负数。其数值部分(D0~D6)不等于真值,应予转换。转换时可采用两种方法。

方法1:“求反加1”法。

采用这种方法时,将补码的符号位和数值部分视为一个整体,按位取反,再在最低位上加1,得到真实结果的二进制数的绝对值。在此结果前面加一负号即得正确答案。将上面的补码按位求反,并加1,可得:01010100+1=01010101B=85,所求十进制数为-85。

方法2:“零减补码”法。

该方法仍将补码的符号位和数值部分视为一个整体,用数零去减补码,做减法时不理会最高位产生的借位,所得结果即为该二进制数的绝对值。此例的计算过程如下。

所求十进制数为-85,与方法1所得结果相同。

表1.2列出部分8位二进制代码分别代表无符号十进制数、原码、反码、补码时所表示的值。

表1.2 8位原码、反码和补码的对照表

1.3.2 有符号数运算时的溢出问题

在讨论溢出问题之前应明确:在计算机中所有信息均用0和1表示。具体地讲,有符号数和无符号数在表现形式上是无法分辨的,而是由程序设计者人为规定的,当然在处理上也就不同了。由于无符号数的各位均为数值,判断运算结果是否溢出,只要测试进位位即可。若为“1”则表示溢出,反之结果正确。

溢出是在一定字长下发生的。从理论上讲,溢出是不可能发生的,因为可以增加位数,实际很难做到,尤其是在单片机开发中更要引起注意。

如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,则采用补码表示法时,可表示的数X的范围是:

-2n-1X≤2n-1-1

n=8时,可表示的有符号数的范围为-128~+127;当n=16时,可表示的有符号数的范围为-32768~+32767。两个有符号数进行加法运算时,如果运算结果超出可表示的有符号数的范围,则就会发生溢出,使计算结果出错。很显然,溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。

具体地讲,对于加运算,如果次高位(数值部分最高位)形成进位加入最高位,而最高位(符号位)相加(包括次高位的进位)却没有进位输出时;或者反过来,次高位没有进位加入最高位,但最高位却有进位输出时,都将发生溢出。因为这两种情况分别是:两个正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数。

【例1.19】

【例1.20】

对于减法运算,当次高位不需从最高位借位,但最高位却需借位(正数减负数,差超出范围),或者反过来,次高位需从最高位借位,但最高位不需借位(负数减正数,差超出范围),也会出现溢出。

【例1.21

【例1.22

在后续课程中将说明,当在加减运算过程中出现结果超出有符号数所能表示的数值范围时,溢出标志位OF被置1。

1.4 定点数和浮点数

在计算机中,用二进制数表示实数的方法有两种,即定点法和浮点法。

1.4.1 定点法

所谓定点数是指小数点的位置固定不变,以定点表示的数。

通常,定点表示有以下两种方法。

方法1:规定小数点固定在最高数值位之前,机器中能表示的所有数都是小数。n位数值部分所能表示的数N的范围(原码表示,下同)是:

-1<N< 1

它能表示的数的绝对值为| x |<1。

方法2:规定小数点固定在最低数值位之后,机器中能表示的所有数都是整数。n位数值部分所能表示的数N的范围是:

-2nN 2n

它能表示的数的绝对值为| x | 2n

如图1.2所示,给出了定点数的两种表示法。

图1.2 定点数的两种表示法

因为实际数值很少有都是小数或都是整数的,所以定点表示法要求程序员做的一件重要工作是为要计算的问题选择“比例因子”。所有原始数据都要用比例因子转化成小数或整数,计算结果又要用比例因子恢复实际值。在计算过程中,中间结果若超过最大绝对值,机器便产生溢出,叫做“上溢”。这时必须重新调整比例因子。中间结果如果小于最小绝对值,则计算机只能把它当做0处理,叫做“下溢”。这时也必须重新调整比例因子。对于复杂计算,计算中间需多次调整比例因子。

1.4.2 浮点法

任意一个二进制数N总可以写成下面的形式:

Nd×2±p

其中:d 称为尾数,是二进制纯小数,指明数的全部有效数字;它前面的符号称做数符,表示数的符号,用尾数前的1位表示,0表示正号,1表示负号;p称为阶码;它前面的符号称做阶符,用阶码前的1位表示,阶符为正时,用0表示,阶符为负时,用1表示。由此可知,将尾数d的小数点向右(对+p)或向左(对-p)移动p位,即得数值N。所以阶符和阶码指明小数点的位置。小数点随p的符号和大小而浮动。这种数称为浮点数。浮点数的编码格式如图1.3所示。

图1.3 浮点数的编码格式

该阶码为m位,尾数的位数为n位,则浮点数的取值范围为:

2-n·2-(2m-1)≤|N|≤(1-2-n)·2(2m-1)

浮点数能表示的数值范围大,这是它的主要可取之处。

如果尾数的绝对值小于1 且大于等于0.5(即采用原码编码的整数或负数和采用补码编码的正数,其尾数的最高位数字为1;采用补码编码的负数,其尾数的最高位数字为0),则该浮点二进制数被称为规格化浮点数。浮点运算后,经常要把结果规格化。规格化的操作是尾数每右移1位(相当于小数点左移1位),阶码加1;尾数每左移1位,阶码减1。

数的加减运算要求小数点对齐。对于浮点表示的数而言,就是阶码(包括阶符)相等。使阶码相等的操作称为对阶。一个浮点数的阶码的改变,必须伴随着尾数的移位,这样才不改变数的值。即阶码加1,尾数必须右移1位;阶码减1,则要求尾数左移1位。两个规格化的浮点数相加或相减之前必须对阶。对阶的规则是:将两个数中阶码小的数的尾数右移,阶码增大,直到与另一个数的阶码相等为止。这样操作是合理的,因为尾数右移,只可能丢失最低有效位,造成的误差较小。

1.5 二进制编码的十进制数

1.5.1 8421 BCD码

在现实生活中,人们习惯用十进制数,计算问题的原始数据大多是十进制数。此时,可以有两种选择:第一种选择是用上面介绍的方法把十进制数转换成二进制数;另一种选择是用二进制数表示十进制数,保留各位之间“逢10进1”的关系,这就是二—十进制编码,或称BCD码(Binary Coded Decimal)。这种编码将一位十进制数用4位二进制数表示,通常以8421为权进行编码。它有10个不同的数字符号,按“逢10进1”原则进位。十进制数与8421 BCD码的对应关系列于表1.3中。

表1.3 十进制数与8421 BCD码对照表

【例1.23】 [867.51]10转换成BCD码。

解:[867.54]10=[100001100111.01010100]BCD

【例1.24】 [1101010110.01010011011]BCD转换成十进制数。

解:[1101010110.010100110110]BCD=[356.536]10

需要进行BCD码与其他进制数之间转换时,可将BCD码先转换成十进制数,再将十进制数转换成其他进制数,反之亦然。例如,将1FDH转换成BCD码时,可先将1FDH转换成十进制数,然后再转换为BCD码。例如:

            [1FD]16=[509]10=[010100001001]BCD

在计算机中,BCD码有两种基本格式:组合式(压缩的)BCD码格式和分离式(非压缩的)BCD码格式。在组合式BCD码格式中,两位十进制数存放在一个字节中。例如,数82的存放格式为:

            1000  0010

在分离式BCD码格式中,每位数存放在8位字节的低4位部分,高4位部分的内容与数值无关。例如,数82的存放格式为:

            uuuu1000  uuuu0010

其中u表示任意值。

BCD码与十进制数之间转换方便,易于阅读和书写。但是用BCD码表示的十进制数的位数要比纯二进制数表示的位数长,运算规则复杂,会造成电路复杂,且影响运算速度。

1.5.2 BCD码的运算

下面以组合式BCD码格式为例,讨论BCD码的加法与减法运算。由于BCD编码是将每个十进制数用一组二进制数来表示的,因此,若将BCD码直接交给计算机去运算,由于计算机总是把数当做二进制数来运算,所以结果可能出错。

【例1.25】 BCD码求38+49。

解:

对应十进制数为81,正确结果为87,显然结果是错误的。其原因是,十进制数相加应“逢10进1”,而计算机按二进制数运算,每4位为一组,低4位向高位进位与十六进制数低位向高位进位的情况相当,是“逢16进1”的,所以当相加结果超过9时将比正确结果小6,因此,结果出错。解决的办法是对二进制数加法运算的结果采用“加6修正”,将二进制数加法运算的结果修正为BCD码加法运算的结果。两个两位BCD数相加时,对二进制数加法运算结果修正的规则如下。

① 当任何两个对应位BCD数相加的结果向高一位无进位时,若得到的结果小于或等于9,则该位无须修正;若得到的结果大于9且小于16,则该位进行加6修正。

② 当任何两个对应位BCD数相加的结果向高一位有进位时(即结果大于或等于16),该位进行加6修正。

③ 当低位修正结果使高位大于9时,高位进行加6修正。

这种修正称为BCD调整。下面通过例题验证上述规则的正确性。

【例1.26】 BCD码求35+21。

解:

低4位、高4位均不满足修正法则,所以结果正确,无须修正。

【例1.27】 BCD码求25+37。

解:

【例1.28】 BCD码求38+49。

解:

【例1.29】 BCD码求42+95。

解:

【例1.30】 BCD码求91+83。

解:

【例1.31】 BCD码求94+7。

解:

【例1.32】 BCD码求76+45。

解:

两个BCD码进行减法运算时,若低位向高位有借位,则由于“借1做16”与“借1做10”的差别,将比正确结果大6。所以有借位时,可采用“减6修正法”来修正。实际上,计算机中有BCD调整指令。两个BCD码进行加减时,先按二进制加减指令进行运算,再对结果用BCD调整指令进行调整,就可以得到正确的十进制运算结果。

另外,BCD码的加减运算,也可以在运算前由程序先变换成二进制数,然后由计算机对二进制数运算处理,运算以后再将二进制数结果由程序转换为BCD码。

1.6 ASCII字符代码

计算机中的每个字符均按某种规则,用一组二进制编码表示。目前微机中应用最普遍的是美国标准信息交换码(American Standard Code for Information Interchange,简称ASCII码)。

ASCII码用7位二进制码对字符进行编码,如附录A所示。ASCII字符集共有128种常用字符,其中有数字字符0~9,大小写英文字母,一些在算式、语句和文本中常用的符号(如四则运算符、括号、标点符号及特殊符号等),还有一些控制字符。这些字符大致能满足各种编程语言、西文文字及常见控制命令等的需要。

每个ASCII码字符用7位编码,最高位用0填充,或者加一位奇偶校验位构成一个满字节。存储器中以字节作为基本的编址单位,正好存放一个字符的ASCII码。

通用键盘的大部分键与最常用的字符相对应。在键盘上输入时,系统软件用扫描法判明所按键的行列位置,组织成扫描码(表示该键在键盘上所在位置的编码),再通过查表或其他方法,最终转换成ASCII码,存入存储器中供处理。计算机将结果输出时,把ASCII码表示的字符送往显示器或打印机,再通过其中的字符发生器转换为该字符的点阵图形。

128个ASCII码字符分为可显示字符和非显示字符两类。可显示字符是指编码从20H到7EH的95个代码。它们可以从键盘终端上输入,可在屏幕终端上显示,也可在打印机上打印出来。非显示字符是编码从00H到1FH的32个代码,还有编码为3FH的字符,共33个,它们主要用来控制输入/输出设备。例如,回车(0DH)字符使显示器的光标回到一行的首部;换行(0AH)字符使显示器光标移到下一行。连续输出回车和换行字符就结束本行输出,光标移到下一行首部,开始新一行的输出。

1.7 其他常用的编码举例

计算机能处理的字符信息显然不只局限于上述ASCII码(128种常用字符),计算机能识别如此众多的汉字,就是因为它们有各自的编码。下面简单介绍汉字的编码。

由于汉字的数量多(常用汉字就有几千个),它的编码相对要复杂些,编码后的二进制数位数也较多。汉字的编码有机内码和机外码两类。机内码是汉字的标识码,机外码则用于汉字的输入,以满足不同的需要。下面分别介绍汉字的国标码、机内码和机外码。

1.国标码

为了在信息交换中有个通用标准,我国在1981年公布了国家标难GB 2312—1980《信息交换用汉字编码字符基本集》,简称国标码。在这一标准中,每个汉字用两个字节(各使用7位二进制数)表示,第一个字节表明字符位于哪一区,第二个字节表明该字符在本区内的哪一位。基本字符集共有94区,每区有94位。另外,该标准又按使用频率,把常用汉字分为一级汉字(3755个)和二级汉字(3008个)。一级汉字按拼音顺序排列,占据16~55区;二级汉字按部首顺序排列,占据56~87区。1~15区用来编排西文字母、数字和图形符号,以及用户自行定义的专用符号。

2.机内码

机内码是计算机系统内部用来表示汉字的编码,以GB 2312—1980码为基础。为使该码与ASCII码有所区别,将汉字国标码每个字节的最高位置1,作为该汉字的机内码。例如,“阿”字的国标码是3022H,其机内码为0B0A2H。

3.机外码

目前常用的机外码主要有区位码、国标码、首尾码、拼音码和五笔字型等。

本章小结

本章主要介绍微型计算机的发展过程、分类及应用范围。首先介绍了数制及各数制之间的转换方法,然后介绍了原码、反码、补码的表示方法及运算方法,以及微型计算机中常用的几种编码。

习题1

1.试阐述微型计算机的应用范围。

2.将下列十进制数转换为二进制数:48;0.56;27.21;189。

3.将下列二进制数转换为十进制数:+1011.01B;-11001.101B;-10011B;+11011B。

4.完成下列转换。

(1)将110111.1011B转换为十六进制数;

(2)将8BH转换为二进制数;

(3)将0ABCH转换为十进制数;

(4)将272转换为十六进制数。

5.设机器字长为8位,写出下列各数的原码、补码和反码。

            11011B;  1111111B;  1000000B;  -11011B;  -1111111B;  -1000000B。

6.将下列十进制数转换为8421 BCD码。

            8609;  5324;  2202;  27。