计算机科学基础Word文件下载.docx
《计算机科学基础Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机科学基础Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
因此可以简化计算机内部运算器、寄存器的线路设计,从而提高运算速度。
表1-1二进制运算规则
加法规则
减法规则
乘法规则
0 + 0 = 0
0 – 0 = 0
0 ×
0 = 0
1 + 0 = 1
1 – 0 = 1
1 ×
0 + 1 = 1
0 – 1 = 1且借位1
1 = 0
1 + 1 = 0且进位1
1 – 1 = 0
1 = 1
(3)实现逻辑运算容易。
计算机系统中除了算术运算外,逻辑运算也很重要,而二进制中的“1”和“0”和逻辑代数中的逻辑量“真”和“假”相吻合,可以使计算机十分方便地进行逻辑运算。
(4)与其他数制转换方便。
二进制与其他几种常用数制的对应关系并不复杂,可以很方便地转换成八进制、十六进制和人们最习惯使用的十进制。
为了便于区别不同的数制,常在数字后面加一个缩写字母作为数制的标识。
表1-2列出了计算机中常用的几种数制。
表1-2计算机中常用的各种数制表示
数制
十进制
二进制
八进制
十六进制
数符
0,1,2,…,9
0,1
0,1,2,…,7
0,1,2,…,9,A,B,C,D,E,F
基数
10
2
8
16
位权
10i
2i
8i
16i
计数规则
逢十进一
逢二进一
逢八进一
逢十六进一
标识字母
D(可省略不写)
B
O
H
标识下标
举例
(123.625)D
(123.625)2
(1111011.101)B
(1111011.101)2
(173.5)O
(173.5)8
(7B.A)H
(7B.A)16
2.各种数制间的转换
绝大多数计算机都使用二进制进行算术逻辑运算,但是计算机用户在输入原始数据,打印、显示运算结果时,习惯使用的仍然是熟悉的十进制,这就要求计算机系统一方面能够将输入的十进制数据转换成二进制数据后再进行计算,另一方面还能够将二进制的计算结果转换成十进制数据后再进行输出。
各种数制间的转换工作由计算机按照一定的算法自动完成。
尽管二进制非常适合在计算机内使用,但是其书写复杂、数位冗长,容易出错且不便阅读。
所以,在计算机技术文献的书写时,常使用八进制和十六进制。
各种数制之间的转换方法如下:
(1)任意进制转换成十进制。
利用按权展开的方法,可以将一个任意进制的数转换成十进制数。
只要将各位数码乘以各自的权值后累加即可。
【例】将二进制数(1001.101)B转换成十进制数。
解(1001.101)B=1 ×
23 + 0 ×
22 + 0 ×
21 + 1 ×
20 + 1 ×
2–1 + 0 ×
2–2 +1 ×
2–3
=8 + 1 + 0.5 + 0.125=(9.625)D
【例】将八进制数(25.46)O转换成十进制数。
解(215.46)O=2 ×
82 + 1 ×
81 + 5 ×
80 + 4 ×
8–1 + 6 ×
8–2
=128 + 8 + 5 + 0.5 + 0.09375=(141.59375)D
【例】将十六进制数(B2A.D)H转换成十进制数。
解(B2A.D)H= 11 ×
162 + 2 ×
161 + 10 ×
160 + 13 ×
16–1
= 2816 + 32 + 10 + 0.8125=(2858.8125)D
(2)十进制转换成二进制。
在将一个十进制数转换成二进制数时,对其整数部分和小数部分需要使用不同算法进行转换,整数部分用除基取余法转换,小数部分用乘基取整法转换。
①除基取余法。
转换算法为:
将十进制整数除以二进制基数2,得到一个商数和余数,取该余数作为二进制数的最低位数d0;
再将所得商数继续除以2,又得到一个商数和余数,取该余数作为二进制数的次低位数d1;
重复此过程,直到商数为0;
将每次除得余数(必定为0或1)按从低位到高位顺次排列,即构成对应的二进制数。
【例】将十进制整数(83)D转换为二进制整数。
解十进制整数余数二进制数码位序
2831d0=1最低位
2411d1=1次低位
2200d2=0
2100d3=0
251d4=1
220d5=0
211d6=1最高位
0商为0,结束
最后结果为:
(83)D=(d6d5d4d3d2d1d0)B=(1010011)B
②乘基取整法。
将十进制纯小数乘以二进制基数2,取其乘积的整数部分作为二进制小数的最高位d–1;
再将乘积的小数部分继续乘以2,所得新积的整数部分作为二进制小数的次高位d–2;
重复此过程,直到余下的纯小数为0或者满足所要求的精度为止;
将每次取出的整数部分(必定为0或1)按从左到右顺次排列,即构成对应的二进制小数。
【例】将十进制小数(0.8125)D转换为二进制小数。
解十进制小数积的整数部分二进制数码位序
0.8125
×
2
1.62501d–1=1最高位
0.625
1.2501d–2=1次高位
0.25
0.500d–3=0
2
1.01d–4=1最低位
0.0纯小数为0,结束
(0.8125)D=(0.d–1d–2d–3d–4)B=(0.1101)B
请注意,并不是所有的十进制小数都能完全精确地转换为有限位的二进制小数,例如,(0.3)D=(0.0011001100…)B。
这时可以根据精度要求并考虑计算机字长取一定位数后,按“0舍1入”原则得到该十进制小数的二进制近似值。
当要把一个既有整数又有小数部分的十进制数转换成二进制数时,按下列3个步骤进行:
①将整数部分按除基取余法进行转换;
②将小数部分按乘基取整法进行转换;
③将已经转换的两部分合在一起即得所求的二进制数。
【例】将十进制数(83.8125)D转换为二进制数。
解由上可知(83)D = (1010011)B
(0.8125)D=(0.1101)B
故(83.8125)D = (1010011.1101)B
(3)二进制与八进制相互转换。
二进制的基数是2,八进制的基数是8。
由于23=8,因此3位二进制数相当于1位八进制数。
表1-3列出了3位二进制数与1位八进制数的对应关系。
表1-3二进制数与八进制数的对应关系
二进制数
000
001
010
011
100
101
110
111
八进制数
1
3
4
5
6
7
当要把二进制数转换成八进制数时,以小数点为分界,整数部分从右向左,小数部分从左向右,每3位划分为一组(不足3位时,整数部分在高位补0占位,小数部分在低位补0占位),然后把每一组二进制数写成所对应的八进制数即可。
【例】将二进制数(1010011.1101)B转换成八进制数。
解(1010011.1101)B = (001010011.110100)B
高位补0┘↓↓ ↓ ↓ ↓└低位补0
123 . 64
(1010011.1101)B = (123.64)O
反之,将每1位八进制数用3位二进制数来表示,就可以把八进制数转换成对应的二进制数。
【例】将八进制数(36.57)O转换成二进制数。
解(36.57)O=
.
↓
(36.57)O=(11110.101111)B
(4)二进制与十六进制相互转换。
二进制的基数是2,十六进制的基数是16。
由于24 = 16,因此4位二进制数相当于1位十六进制数。
表1-4列出了4位二进制数与1位十六进制数的对应关系。
表1-4十六进制数与十进制数、二进制数的对应关系
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
十进制数
9
11
12
13
14
15
十六进制数
A
C
D
E
F
与二进制转换成八进制类似,当要把二进制数转换成十六进制数时,以小数点为分界,整数部分从右向左,小数部分从左向右,每4位划分为一组(不足4位时,整数部分在高位补0占位,小数部分在低位补0占位),然后把每一组二进制数写成所对应的十六进制数即可。
【例】将二进制数(1011011.1101)B转换成十六进制数。
解(1011011.1101)B=(01011011.1101)B
高位补0┘ ↓↓↓
5 B . D
(1011011.1101)B=(5B.D)O
反之,将每1位十六进制数用4位二进制数来表示,就可以把十六进制数转换成对应的二进制数。
【例】将十六进制数(3A.7C)H转换成二进制数。
解(3A.7C)H=
(3A.7C)H=(111010.011111)B
(5)八进制与十六进制相互转换。
如果需要把八进制与十六进制相互转换时,则需要借助二进制来实现。
先把八进制数(或十六进制数)转换成二进制数,然后把所得的二进制数再转换成十六进制数(或八进制数)即可。
【例】将十六进制数 (2A.5C)H 转换成八进制数。
解(2A.5C)H=
(2A.5C)H=(52.27)O
1.2数据的表示
1.2.1数值的编码表示
计算机可以处理的信息多种多样,其中一类就是按进位计数制表示的有大小、正负之分的数值型数据。
因为计算机内部硬件只能表示0和1两种状态,所以在表示数值时,除了要将数值转换为二进制数来表示外,还必须考虑如何用二进制形式表示数的正、负符号和小数点。
通常,把数值在计算机中的二进制表示形式称为机器数,而把它所代表的一般数学意义上用正负号和数符表示的实际数值称为真值。
在计算机中,1位二进制数叫做一个比特(bit),8位叫做一个字节(Byte),即8bit = 1Byte。
1.机器数
数学上的数有正数和负数之分。
在计算机中,通常把一个数的最高位(最左侧的一位)定义为符号位,并且一般规定以二进制的0表示正号“+”,1表示负号“–”,称之为数符,而把其余位表示为数值。
例如,真值数(–0110101)B,其机器数为10110101,机内表示如图1-1所示。
↑
图1-1数的机内表示形式
2.整数和实数
在计算机内部,并不显式地表示出小数点,而是通过对小数点的位置加以规定来表示。
所以,整数和实数在机内的表示是不同的。
(1)整数。
整数没有小数部分,因此可以认为小数点固定在数的最右边。
整数可以分为无符号整数和有符号整数两类。
无符号整数的所有二进制位全部用来表示数值的大小,常被用来表示计算机中的地址。
有符号整数通常最高位表示数的正负号,而其他位表示数值的大小。
一般把计算机能够直接处理的二进制位数称为机器字长。
整数表示的数值是精确的,但可以表示的数值范围受机器字长的限制。
现代计算机的机器字长一般为8、16、32、64、128位等,每种情况下可以表示的整数的范围如表1-5所示。
表1-5各种字长下可表示的整数范围
机器字长
无符号整数
有符号整数
0~255(28–1)
–128~127(27–1)
64
0~264–1
–263~263–1
0~65535(216–1)
–32768~32767(215–1)
128
0~2128–1
–2127~2127–1
32
0~232–1
–231~231–1
例如,机器字长为8位,则整数–65的机内表示形式如图1-2所示。
图1-2整数的机内表示形式
(2)实数。
在进行科学计算时,计算机处理更多的是实数。
实数是既有整数部分又有小数部分的数,纯小数可看作实数的特例。
因为实数可能很大或者很小,所以人们一般采用“浮点数表示法”来表示,即把一个实数的范围和精度用阶码和尾数两部分来分别表示。
例如,0.3429 ×
106,其中0.3429称为尾数,6称为阶码。
由于阶码可以取不同数值,使得小数点的位置不固定,对于一个实数可以有多种表示形式,所以称为浮点数表示法。
例如,十进制实数–12345.6789可以表示为:
–0.123456789 ×
105、–12.3456789 ×
10+3、–12345.6789 ×
100、–1234567.89 ×
二进制实数的表示类似,例如,1010.1011可表示为:
1010.1011=210 ×
10.101011=2–10 ×
101010.11=2+100 ×
0.10101011
在计算机中,为了提高数据表示精度,必须惟一地规定小数点的位置,因此规定浮点数必须写成规格化的形式,即当尾数不为0时,其绝对值大于等于0.5且小于1。
尾数表示数值的有效数字,是纯小数,其位数将影响数的精度,其符号决定数的符号。
阶码相当于数学中的指数,其大小用来指示尾数中的小数点应当向左或向右移动的位数,其位数将决定数的表示范围。
在浮点数表示中,数符和阶符通常各占一位,并且约定小数点的位置在数符和尾数之间。
一个浮点数的机内表示形式如图1-3所示。
阶符
阶码
尾数
图1-3浮点数的机内表示形式
例如,设机器字长为16位,尾数为8位,阶码为6位,则二进制实数–1101.010=–0.110101 ×
2100,其机内表示形式如图1-4所示。
000100
11010100
图1-4(–1101.010)B的机内表示形式
3.常用数值编码
由于机器数在计算时,如果符号位和数值位同时参与运算,则可能会产生错误结果;
而如果单独考虑符号问题,又会增加运算器件的实现难度。
因此,为了使计算机能够方便地对数值进行各种算术逻辑运算,必须对数值型数据进行二进制编码处理。
所谓编码是采用少量的基本符号(如0和1),按照一定的组合原则,来表示大量复杂多样的信息的技术。
编码的优劣直接影响到计算机处理信息的速度。
数值型数据的常用编码方法包括:
原码、反码、补码。
(1)原码。
原码的编码规则是:
符号位0表示正,1表示负,数值部分用该数绝对值的二进制数表示。
当整数时,小数点隐含在最低位之后;
当纯小数时,小数点隐含在符号位和数值位之间,均不占位。
通常用[X]原表示数X的原码。
例如,设机器字长为8位,
[+1]原 = 00000001[+127]原 = 01111111[+0]原 = 00000000
[– 1]原 = 10000001[– 127]原 = 11111111[– 0]原 = 10000000
显然,按原码的编码规则,零有两种表示形式。
原码表示法简明易懂,与其真值的转换方便,比较容易进行乘除运算。
但是在进行加减运算时,原码运算很不方便。
由于符号位不能和数值一样参与运算,所以要根据两数的符号情况,同号相加,异号相减,还要根据两数的绝对值大小,令大数减去小数,最后还要判断结果的符号。
这样不仅要求运算器既能作加法,又能作减法,还必须附加许多条件判断的处理,最终既增加了运算器的实现复杂性,又延长了运算的时间。
(2)反码。
反码的编码规则是:
符号位0表示正,1表示负,正数的反码等于原码,负数的反码等于原码除符号位外按位取反,即0变1、1变0。
通常用[X]反表示数X的反码。
[+1]反 = 00000001[+127]反 = 01111111[+0]反 = 00000000
[–1]反 = 11111110[–127]反 = 10000000[–0]反 = 11111111
显然,按反码的编码规则,零也有两种表示形式。
反码很容易由原码获得,但同样不方便运算,一般在求补码的过程中用到反码。
(3)补码。
补码的编码规则是:
符号位0表示正,1表示负,正数的补码等于原码,负数的补码等于反码末位加1。
通常用[X]补表示数X的补码。
[+1]补 = 00000001[+127]补 = 01111111[+0]补 = 00000000
[–1]补 = 11111111[–127]补 = 10000001[–0]补 = 00000000
显然,按补码的编码规则,零有惟一的表示形式。
补码的概念来源于数学上的“模”和补数。
例如,将钟表的时针顺时针拨快5小时和逆时针拨慢7小时,最后指示的位置相同,则称5和–7互为模12情况下的补数。
计算机中机器数受机器字长限制,所以是有限字长的数字系统。
对于整数来说,机器字长为n位(含符号位),模是2n;
对于有符号纯小数来说,模是2。
求补运算通常利用反码来实现。
【例】求X = +1011,Y = –1101的原码、反码和补码。
解[X ]原 = 01011[Y ]原 = 11101
[X ]反 = 01011[Y ]反 = 10010
[X ]补 = 01011[Y ]补 = 10011
采用补码进行加减运算十分方便。
通过对负数的编码处理,允许符号位和数值一起参与运算,可以把减法运算转化为加法运算。
不论求和求差,也不论操作数为正为负,运算时一律只做加法,从而大大简化运算器的设计,加快了运算速度。
例如,(–9)+(–5)的运算如下:
[–9]补 = 1111011111110111
[–5]补 = 11111011+11111011
111110010
因为机器字长的限制,丢失高位1,运算结果机器数为11110010,是–14的补码形式。
目前,由于计算机中最多的运算是加减运算,为了简化运算器设计,加快运算速度,有些计算机在数值表示、存储、运算时均采用补码表示法,也有些计算机,数用原码进行存储和传送,运算时采用补码,还有些计算机在进行加减法时采用补码运算,而在进行乘除法时采用原码运算。
4.精度和溢出
现代数字计算机是有限字长的数字系统,机器数表示的范围受到机器字长和数据类型的限制,一旦机器字长和数据类型确定了,机器数所能表示的数的范围和精度也就确定了。
所谓精度,是指可以给出的有效数字的位数。
一般来说,机器字长越长,可以表示的数的范围越大,精度越高;
当字长相同时,浮点数通常比整数可以表示的数的范围要大;
浮点数表示时,阶码位数越多,可以表示的数的范围越大,尾数位数越多,可以表示的数的精度越高。
如果一个数的大小超出了计算机所能表示的数的范围,则产生“溢出”。
如果两个正数相加,结果大于机器所能表示的最大正数,称为“上溢”;
如果两个负数相加,结果小于机器所能表示的最小负数,称为“下溢”。
例如,字长为n位的有符号整数,最高1位为符号位,数值位为n–1位,用补码表示时,数的表示范围为–2n–1~2n–1–1,一旦运算时发生结果超出此范围的情况,就产生溢出。
产生溢出时,将造成运算结果错误。
所以当产生溢出时,计算机状态字寄存器(PSW)的溢出标志位将自动置为1,否则为0。
在计算机中有很多判断溢出的方法,一般通过逻辑电路自动检测到溢出后执行相应的中断处理。
要想尽量避免产生溢出错误,在设计计算机硬件时可以考虑增加机器字长以表示更大范围的数值。
1.2.2非数值信息的表示
现代计算机需要处理的信息,除了数值信息之外,还有大量的非数值信息。
例如,表示文字语言、逻辑语言的数字、字母、专用符号、汉字,以及语音、图像等多媒体信息。
由于数字计算机只能处理二进制数据,所以当把这些信息应用到计算机中时,都必须编写为二进制形式的代