计算机中数的表示及运算.docx
《计算机中数的表示及运算.docx》由会员分享,可在线阅读,更多相关《计算机中数的表示及运算.docx(16页珍藏版)》请在冰点文库上搜索。
计算机中数的表示及运算
计算机中数的表示及运算
张晓军编写
引言
人类在文字出现以前,就已经会用道具(如绳子打结)计数了.在日常生活中,我们每天都在与数字打交道,而数字与数制是密不可分的.比如:
60秒为1分,60分为1小时,其特点是"逢60进1",可取的数字是0,1,2,...,59,共有60个,这就是"六十进制".再比如:
24小时为1天,这是24进制;7天为1星期,这是7进制;12个为1打,这是12进制;10mm为1cm,10cm为1dm,10dm为1m,这是我们最为熟悉的10进制.不管是什么进制,其基数(如60进制的基数就是60,10进制的基数就是10)正好等于该数制中不同"数字符号"的个数(如60进制中采用0,1,2,...,59共60个不同的数字符号,10进制中采用0,1,2,...,9共10个不同的数字符号).
一、常用数制及其相互转换
在数制系统中,各位数字所表示的值不仅与该数字有关,而且与它所在的位置有关.
例如,在10进制数123中,百位上的1表示1个100,十位上的2表示2个10,个位上的3表示3个1,因此,有:
123=1*100+2*10+3*1,其中100,10,1被称为百位、十位、个位的权。
十进制中,个、十、百、千、万……等各数位的权分别是1,10,100,1000,10000,……,一般地,写成10的幂,就是100,101,102,103,104,……;10则被称为十进制的基数
1.1十进制数
特点:
采用0,1,2,3,4,5,6,7,8,9共10个不同的数字符号,并且是"逢十进一,借一当十".
对于任意一个十进制数,都可以表示成按权展开的多项式。
例如:
1999=1*103+9*102+9*101+9*100
2003=2*103+0*102+0*101+3*100
48.25=4*101+8*100+2*10-1+5*10-2
1.2二进制数
在电子计算机中采用的是二进制.二进制数只需2个不同的数字符号:
0和1,并且是"逢二进一,借一当二",它的基数是2.对于二进制数,其整数部分各数位的权,从最低位开始依次是1,2,4,8,……写成2的幂,就是20,21,22,23,……;其小数部分各数位的权,从最高位开始依次是0.5,0.25,0.125,……,写成2的幂,就是2-1,2-2,2-3,…….
对于任意一个二进制数,也都可以表示成按权展开的多项式。
例如:
(10110101)2=1*27+0*26+1*25+1*24+0*23+1*22+0*21+1*20
(10.11)2=1*21+0*20+1*2-1+1*2-2
为什么人们在计算机中采用二进制?
这是因为,二进制数具有以下一些重要特点:
(1)二进制数只含有两个数字0和1,因此可用大量存在的具有两个不同的稳定物理状态的元件来表示.例如,可用指示灯的不亮和亮,继电器的断开和接通,晶体管的断开和导通,磁性元件的反向和正向剩磁,脉冲电位的低和高等等,来分别表示二进制数字0和1.计算机中采用具有两个稳定状态的电子或磁性元件表示二进制数,这比十进制的每一位要用具有十个不同的稳定状态的元件来表示,实现起来要容易得多,工作起来也稳定得多.
(2)二制数的运算规则简单,使得计算机中的运算部件的结构相应变得比较简单.
二进制数的加法和乘法的运算规则只有4条:
0+0=0 0+1=1 1+0=1 1+1=10
0*0=0 0*1=0 1*0=0 1*1=1
实际上,二进制数的乘法可以通过简单的移位和相加来实现
(3)二进制数的两个数字0和1与逻辑代数的逻辑变量取值一样,从而可采用二进数进行逻辑运算,这样就可以应用逻辑代数作为工具来分析和设计计算机中的逻辑电路,使得逻辑代数成为计算机设计的数学基础.
1.3二进制数与十进制数间的相互转换
(1)二进制数转换成十进制数——乘权求和,即将二进制数按权展开求和。
例1把二进制数1101.11转换成十进制数
(1101.11)2=1*23+1*22+0*21+1*20+1*2-1+1*2-2
=8+4+0+1+0.5+0.25
=13.75
(2)十进制数转换成二进制数——整数部分辗转除以2取余,小数部分辗转乘以2取整
即将十进制整数除以2,得到一个商和一个余数;再将商除以2,又得到一个商和一个余数;以此类推,直到商等于零为止。
每次得到的余数的倒排列,就是对应二进制数的各位数。
例2把十进制数37转换成二进制数
于是得:
(37)10=(100101)2
十进制小数转换成二进制小数是用“乘2取整法”。
即用2逐次去乘十进制小数,将每次得到的积的整数部分按各自出现的先后顺序依次排列,就得到相对应的二进制小数。
例3把(0.6875)10转换成二进制数
设(0.6875)10=a-1*2-1+a-2*2-2+…+a-m*2-m
于是得:
(0.6875)10=(0.1011)2
说明:
一个有限的十进制小数并非一定能够转换成一个有限的二进制小数,即上述过程的乘积的小数部分可能永远不等于0,这时我们可按要求进行到某一精确度为止.
如(0.1)10=(0.000110011001100110011001100...)2
如果一个十进制数既有整数部分又有小数部分,则可将整数部分和小数部分分别进行转换,然后再将两部分合起来.
如(37.6875)10=(100101.1011)2
1.4八进制数与十六进制数
在计算机内部,一切信息的存储、处理与传送均采用二进制的形式。
但由于二进制数所需位数较多,阅读与书写很不方便,为此,在阅读与书写时又通常用十六进制或八进制来表示,这是因为十六进制和八进制与二进制之间有着非常简单的对应关系
八进制数的基数是8,有8个基本数字:
0,1,2,3,4,5,6,7,并且"逢八进一,借一当八".
由于八进制数的基数8是二进制数的基数2的3次幂,即23=8,所以一位八进制数相当于3位二进制数,这样使得八进制数与二进制数之间的转换十分方便.
十六进制数的基数是16,有16个基本数字:
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,并且"逢十六进一,借一当十六".
由于十六进制数的基数16是二进制数的基数2的4次幂,即24=16,所以一位八进制数相当于4位二进制数,这样使得十六进制数与二进制数之间的转换十分方便.
进制转换对照表
二进制
八进制
十进制
十六进制
0000
0
0
0
0001
1
1
1
0010
2
2
2
0011
3
3
3
0100
4
4
4
0101
5
5
5
0110
6
6
6
0111
7
7
7
1000
10
8
8
1001
11
9
9
1010
12
10
A
1011
13
11
B
1100
14
12
C
1101
15
13
D
1110
16
14
E
1111
17
15
F
10000
20
16
10
10001
21
17
11
10010
22
18
12
10011
23
19
13
…
…
…
…
例4把(56.103)8转换成二进制数(一位变三位)
5
6
.
1
0
3
↓
↓
↓
↓
↓
↓
101
110
.
001
000
011
所以(56.103)8=(101110.001000011)2
例5把(11101.1101)2转换成八进制数(三位变一位)
以小数点为中心,向两边每隔3位分组(不足3位的,在外边补0):
011
101
.
110
100
↓
↓
↓
↓
↓
3
5
.
6
4
所以(11101.1101)2=(35.64)8
例6把(3AD.B8)16转换成二进制数(一位变四位)
3
A
D
.
B
8
↓
↓
↓
↓
↓
↓
0011
1010
1101
.
1011
1000
所以(3AD.B8)16=(1110101101.10111)2
例7把(1111100111.111111)2转换成十六进制数(四位变一位)
以小数点为中心,向两边每隔4位分组(不足4位的,在外边补0):
0011
1110
0111
.
1111
1100
↓
↓
↓
↓
↓
↓
3
E
7
.
F
C
所以(1111100111.111111)2=(3E7.FC)16
其他进制数与十进制数之间的转换
把其他进制数转换成十进制数,都用乘权求和的方法;
把十进制数转换成其他进制数,都用整数部分辗转除以其他进制数的基数取余,小数部分辗转乘以其他进制数的基数取整的方法
例8把(17.26)8转换成十进制数(乘权求和)
(17.26)8=1*81+7*80+2*8-1+6*8-2
=8+7+2*0.1256*0.015625
=15.34375
例9把(65535)10转换成16进制数(辗转除以16取余)
所以(65535)10=(FFFF)16
二、计算机中数的表示
在计算机中所有的数据、指令以及符号等都是用特定的二进制代码表示的。
我们把一个数在计算机内被表示的二进制形式称为机器数,该数称为这个机器数的真值。
机器数具有下列特点:
(1)由于计算机设备的限制和操作上的便利,机器数有固定的位数。
它表示的数受到固定位数的限制,具有一定的范围,超过这个范围就会产生“溢出”。
例如,一个8位机器数,所能表示的无符号整数的最大值是“11111111”,即十进制数255,如果超过这个数就会“溢出”。
(2)机器数能表示数的符号(正、负或0)。
通常是用机器数中规定的符号位(一般是最高位)取0或1表示数的正或负。
例如,一个8位机器数,其最高位是符号位,那么在定点整数原码表示的情况下,对于00101110和10010011,其真值分别为十进制数+46和-19。
(3)机器数中,采用定点或浮点方式来表示小数点的位置。
2.1原码,反码和补码
在计算机中参加运算的数有正负之分,通常在计算机中我们用X=X0X1X2……XN-1来表示一个二进制数,并规定当X0=0时X为正数,X0=1时X为负数.在计算机中这种表示法有原码,补码和反码三种。
1.原码
原码的定义:
其最高位为符号位,0表示正,1表示负,其余位数表示该数的绝对值。
通常用[X]原表示X的原代码。
例如:
假设,因为(17)10=(10001)2,(39)10=(100111)2,那么
[+17]原=00010001,[-39]原=10100111
[+0]原=00000000,[-0]原=10000000,因此,0的表示有两种,"浪费"了资源.
当机器数的位数是8时,原码表示范围是[-127,127]。
原码的表示法简单易懂,但是它最大的缺点是运算复杂。
2.反码
反码的定义:
正数的反码与原码相同,负数的反码是把其原码除符号位外的各位取反(即0变1,1变0).通常用[X]反表示X的反码。
例如:
[+45]反=[+45]原=00101101
由于[-32]原=10100000,
所以[-32]反=11011111
[+0]反=[+0]原=00000000,[-0]原=10000000,[-0]反=11111111,因此0的表示也有两种
根据[X]反所能表示的整数范围公式,我们可以计算出当n=8时反码表示范围是[-127,127]。
3.补码
补码的定义:
正数的补码与原码相同,负数的反码是在其反码的最低有效位上加1。
通常用[X]补表示X的补码。
例如:
[+14]补=[=14]原=00001110
由于[-36]原=10100100,而[-36]反=11011011,所以[-36]补=11011100
[+0]补=[+0]原=00000000,[-0]反=11111111,规定[-0]补=00000000(溢出部分忽略),这样在用补码表示时,0的表示方法就唯一了.
根据[X]补所能表示的整数范围公式,我们可以计算出当n=8时补码表示范围是[-128,127]
用补码进行加减运算是很简单的,公式为
[X+Y]补=[X]补+[Y]补
[X-Y]补=[X]补+[-Y]补
加法公式是非常简单的,在减法中我们可以根据[Y]补求[-Y]补:
将[Y]补连同符号位一起按位求反后末位加1可得[-Y]补。
在运算中符号位怎么办?
符号位参加运算,符号位相加,若有进位,则进位舍去。
例10已知X=6,Y=2,求X-Y
解:
[X]补=00000110,[Y]补=00000010,[-Y]补=11111110
最后舍弃符号位上的进位,得[X-Y]补=00000100,即X-Y=4
例11已知X=-19,Y=-30,求X+Y
解:
[X]补=11101101,[Y]补=11100010,
最后舍弃符号位上的进位,得[X+Y]补=11001111,即X+Y=-49
补码的重大意义从上面例子可见,加法和减法统一成了加法,再由于乘除可通过移位和加减来实现,于是就使四则算术运算在计算机中能转化成对补码进行简单的移位和相加,从而大大减化了计算机运算部件的电路设计.
2.2数的定点和浮点表示
在计算机中,针对小数点的处理有两种方法:
定点表示法与浮点表示法。
1.定点表示法
定点表示法就是小数点约定在机器数某一固定的位置上。
如果将小数点约定在符号位和数值的最高位之间,这时的数值为定点有符号纯小数。
例如:
[X]补=01010000
↑
小数点位置
这时X=0.625
如果将小数点约定在数值的最低位之后,这时的数值均为整数。
例如:
[X]补=11010000
↑
小数点位置
这时X=-48
对于8位定点有符号整数,用补码表示,
最大数[M]补=01111111,即M=+(27-1)=+127
最小数[N]补=10000000,即N=-27=-128
所以对于8位定点有符号整数(用补码表示)的范围是-128~+127,共28=256个不同的整数,在PASCAL语言中,shortint类型的数据即是1字节(8位)定点有符号整数;
而对于8位定点无符号(没有符号位,即约定为非负数)整数(用原码表示即可,这里补码与原码相同)的范围是0~28-1,即0~255,共28=256个不同的整数,在PASCAL语言中,byte类型的数据即是1字节(8位)定点无符号整数;
同理可得:
16位定点有符号整数(用补码表示)的范围是-215~+(215-1),即-32768~+32767,在PASCAL语言中,integer类型的数据即是2字节(16位)定点有符号整数;
而对于16位定点无符号整数(用原码表示即可)的范围是0~216-1,即0~65535,共216=65536个不同的整数,在PASCAL语言中,word类型的数据即是2字节(16位)定点无符号整数;
32位定点有符号整数(用补码表示)的范围是-231~+(231-1),即-2147483648~+2147483647,在PASCAL语言中,longint类型的数据即是4字节(32位)定点有符号整数;
在PASCAL语言中,定义了上述5种类型的整数数据类型,列表如下:
名称
类型标识符
大小
最小值
最大值
不同数据个数
字节型
shortint
1字节即8个二进制位
-128
127
256
短整型
byte
1字节即8个二进制位
0
255
256
标准型
integer
2字节即16个二进制位
-32768
32767
65536
字 型
word
2字节即16个二进制位
0
65535
65536
长整型
longint
4字节即32个二进制位
-2147483648
2147483647
4294967296
2.浮点表示法
浮点表示法就是小数点的位置并不固定。
浮点数在计算机中通常的表示形式为"浮点数=2的正/负阶码次方*尾数"其中阶码是个正整数,尾数是个小数,我们规定尾数的区间为[0.5,1),如果尾数不在此区间,那我们可通过调节阶码来满足区间,此方法称为规格化。
在计算机中所说的浮点数就是指小数点位置不固定的数。
一般地,一个既有整数部分又有小数部分的十进制数D可以表示成如下形式:
D=R*10N
其中R为一个纯小数,N为一个整数。
如一个十进制数123.456可以表示成:
0.123456*103,十进制小数0.00123456可以表示成0.123456*10-2。
纯小数R的小数点后第一位一般为非零数字。
同样,对于既有整数部分又有小数部分的二进制数口也可以表示成如下形式:
D=R*2N
其中R为一个二进制定点小数,称为D的尾数;N为一个二进制定点整数,称为D的阶码,它反映了二进制数D的小数点的实际位置。
为了使有限的二进制位数能表示出最多的数字位数,定点小数R的小数点后的第一位(即符号位的后面一位)一般为非零数字(即为“1”)。
在计算机中,通常用一串连续的二进制位来存放二进制浮点数,它的一般结构如图所示:
阶符
N
数符
R
| 阶码部分 | 小数位 尾数部分
三、字符与汉字的编码
1.字符的编码
计算机除了用于数值计算外,还有其他许多方面的应用。
因此,计算机处理的不只是一些数值,还要处理大量符号如英文字母、汉字等非数值的信息。
例如,当你要用计算机编写文章时,就需要将文章中的各种符号、英文字母、汉字等输入计算机,然后由计算机进行编辑排版。
因此,计算机要对各种文字进行处理。
通常,计算机中的数据可以分为数值型数据与非数值型数据。
其中数值型数据就是常说的“数”(如整数、实数等),它们在计算机中是以二进制形式存放的。
而非数值型数据与一般的“数”不同,通常不表示数值的大小,而只表示字符或图形等信息,但这些信息在计算机中也是以二进制形式来表示的。
目前,国际上通用的且使用最广泛的字符有:
十进制数字符号0~9,大小写的英文字母,各种运算符、标点符号等,这些字符的个数不超过128个。
为了便于计算机识别与处理,这些字符在计算机中是用二进制形式来表示的,通常称之为字符的二进制编码。
由于需要编码的字符不超过128个,因此,用七位二进制数就可以对这些字符进行编码。
但为了方便,字符的二进制编码一般占八个二进制位,它正好占计算机存储器的一个字节。
具体的编码方法,即确定每一个字符的七位二进制代码。
但目前国际上通用的是美国标准信息交换码(AmericanStandanlCodeforInformationInterchange),简称为ASCII码(取英文单词的第一个字母的组合)。
用ASCII表示的字符称为ASCII码字符。
下表是ASCII码编码表:
表中前32个与最后一个是不可打印的控制符号。
特别需要指出的是,十进制数字字符的ASCII码与它们的二进制值是有区别的。
例如,十进制数3的七位二进制数为(0000011),而十进制数字字符“3”的ASCII码为(0110011)2=(33)16=(51)10,由此可以看出,数值3与数字字符“3”在计算机中的表示是不一样的。
数值3能表示数的大小,并可以参与数值运算;而数字字符“3”只是一个符号,它不能参与数值运算。
2.汉字的编码
国标GB2312-80规定,全部国标汉字及符号组成94*94的矩阵,在这矩阵中,每一行称为一个“区”,每一列称为一个“位”。
这样,就组成了94个区(01~94区),每个区内有94个位(01~94)的汉字字符集。
区码和位码简单地组合在一起(即两位区码居高位,两位位码居低位)就形成了“区位码”。
区位码可唯一确定某一个汉字或汉字符号,反之,一个汉字或汉字符号都对应唯一的区位码,如汉字“玻”的区位码为“1803”(即在18区的第3位)。
所有汉字及符号的94个区划分成如下四个组:
1~15区为图形符号区,其中,1~9区为标准 区,10~15区为自定义符号区。
16~55区为一级常用汉字区,共有3755个汉字,该区的汉字按拼音排序。
56~87区为二级非常用汉字区,共有3008个汉字,该区的汉字按部首排序。
88~94区为用户自定义汉字区。
汉字的内码是从上述区位码的基础上演变而来的。
它是在计算机内部进行存储、传输所使用的汉字代码。
区码和位码的范围都在01~94内,如果直接用它作为内码就会与基本ASCII码发生冲突,因此汉字的内码采用如下的运算规定:
高位内码=区码十20H+80H
低位内码=位码十20H+80H
在上述运算规则中加20H应理解为基本ASCII的控制码;加80H意在把最高二进制位置“1”,以与基本ASCII码相区别,或者说是识别是否汉字的标志位。
例:
将汉字“玻”的区位码转换成机内码:
高位内码=(18)10+(20)16+(80)16
=(00010010)2+(00100000)2+(10000000)2
=(10110010)2
=(B2)16=B2H
低位内码=(3)10+(20)16+(80)16
=(00000011)2+(00100000)2+(10000000)2
=(10100011)2
=(A3)16=A3H
内码=区码+20H+80H+位码+20H+80H
=(1011001010100011)2=B2A3H