1.2 计算机中数据的表示与存储
计算机的科学研究主要包括信息采集、存储、处理和传输,而这些都与信息的量化和表示密切相关。
1.2.1 数据与信息
数据是对客观事物的符号表示,数值、文字、语言、图形、图像等都是不同形式的数据。计算机科学中的信息通常被认为是能够用计算机处理的有意义的内容或消息,它们以数据的形式出现。
1.2.2 计算机中的数制
计算机可以代替人工对信息加工处理,它既能够处理数字信息和文字信息,又可以处理图形、图像、声音等信息。一切信息在计算机内部都能用0和1两个数字组成的数字序列表示。我们日常使用的是十进制数,十进制数在计算机内需要进行转换处理。
二进制数只有0和1两个数,相对十进制数而言,使用二进制数表示不但运算简单、易于物理实现、通用性强,更重要的优点是,所占用的空间和所消耗的能量小得多,而且其可靠性大大提高。计算机内部均使用二进制数表示各种信息,但计算机与外部交往仍采用人们熟悉和便于阅读的形式,如十进制数据、文字显示和图形描述等。其间的转换,则由计算机系统的硬件和软件来实现。各类数据在计算机中的转换过程如图1-4所示。
图1-4 各类数据在计算机中的转换过程
数制,即进位计数制,是人们利用数字符号按进位原则进行数据大小计算的方法,通常是以十进制来进行计算的。另外,还有二进制、八进制和十六进制等。
1.数制
在日常生活中除了经常用到的逢十进一的十进制计数外,还有许多非十进制的计数方法,如时间为逢六十进一(60秒为1分钟,60分钟为1小时)的六十进制计数、1年有12个月为逢十二进一计数等。
计算机系统中采用由0和1来表示二进制计数,是因为这两种状态恰好可以由电脉冲的“关”状态表示(低位)0,“开”状态表示(高位)1,可以使计算机数字电路设计简单、运算简单、工作可靠和逻辑性强。
2.数制的按权展开式
无论哪种数制都有共同的“逢N进一”计数运算规律和“位权表示法”特点。N是指数制中所需要的数字字符的总个数,称为基数。例如,十进制数的基数是10(数字字符的个数是十个),二进制数的基数是2(数字字符的个数是0、1两个)等。数字的值与它所处的位置是确定的,这个固定的位置上的值称为位权。例如,十进制数53.4,数字5位于十位上,它代表5×101=50,即5所处的位置具有101权(位权);3位于个位上代表3×100=3,即3所处的位置具有100权(位权);4代表4×10-1=0.4。“位权表示法”的特点是用来进行数制间的转换。
各进位制中位权的值是基数的若干次幂。因此,使用任何一种数制表示的数都可以写成按位权展开的多项式之和。设一个基数为D的数值K,K=(Kn、Kn-1、…、K1、K0、K-1、…、K-m),则K的展开为:
K=Kn×Dn-1+Kn-1×Dn-2+…+K1×D0+K0×D-1+…+K-m×D-m-1
对于二进制、十进制和十六进制,其基数D分别为2、10、16。
例如,在十进制数中,937.58可以用以下展开式表示:
937.58=9×102+3×101+7×100+5×10-1+8×10-2
3.不同进制数间的对应关系
不同的进制数之间可以相互转换,其中的各种转换所采用的转换方法也不同。
二进制数和十进制数的对应关系如表1-2所示。
表1-2 二进制数和十进制数的对应关系
八进制数、十六进制数和二进制数的对应关系如表1-3所示。
表1-3 八进制数与二进制数和十六进制数与二进制数之间的对应关系
为了区别不同进制数,常在不同进制数后加一字母表示:十进制数,在数字后加字母D或不加字母,如928D或928;二进制数,在数字后加字母B,如101101B;八进制数,在数字后加字母O,如66O;十六进制数,在数字后加字母H,如A601H。
4.不同进制数的转换举例
(1)二进制数与十进制数之间的转换
二进制数转换为十进制数的基本原理:将二进制数从小数点分界点,往左从0开始对各位进行正序编号,往右序号则分别为-1,-2,-3,…直到最末位,然后分别将各位上的数乘以2的k次方所得的值进行求和,其中k的值为各个位所对应的上述编号。例如,将二进制数1101.101转换为十进制数,方法如下。
1001.101=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
结果为(1001.101)2=(9.625)10二进制数转换为十进制数,只需将每位数按位权展开多项式相加。如将二进制数1101转换成十进制数。
(1101)2=1×23+1×22+0×21+1×20=8+4+0+1=(13)10
十进制数转换成二进制数,一般将十进制数分为整数和小数两部分分别进行转换,整数部分和小数部分的转换方法略有不同。
整数部分的转换可采用“除2倒取余法”,用列除式的算法将十进制整数不断地除以2,直到商为0为止,最后将所取余数按逆序排列即得到了转换后的二进制数。例如,要将十进制数25转换为二进制数,方法如下。
得到的余数按逆序排列为11001,因此(25)10=(11001)2
小数部分的转换可采用“乘2取整法”,即将十进制数的小数部分不断地乘以2,每做一次乘法都取出所得到乘积的整数部分,再以积的小数部分乘以2,再取出整数部分,以此类推。如果小数部分正好是5的倍数,则一般计算到小数部分为0时为止,否则以计算到约定的精确度为准,最后将所取整数按顺序排列。例如,要将十进制数0.75转换为二进制数,方法如下。
结果为(0.75)10=(0.11)2
(2)二进制数与八进制数之间的转换
二进制数转换为八进制数的基本原理:由于八进制数的基数8是2的三次方(即8=23),因此,一个二进制数转换为八进制数,如果是整数,只要从它的低位向高位每3位二进制数组成一组,然后将每组二进制数分别用一位相应的八进制数表示;如果有小数部分,则从小数点开始,分别向小数左右两边按照上述方法进行分组计算,若小数部分最末组不足三位则后面补0。例如,将二进制数10111.11转换为八进制数,方法如下。
即(10111.11)2=(27.6)8
八进制数转换为二进制数的基本原理:八进制数转换为二进制数,只要从它的低位开始将每1位八进制数用3位二进制表示出来。如果有小数部分,则从小数点开始,分别向左右两边按照上述方法进行转换。例如,将八进制数64.3转换为二进制数,方法如下。
即(64.3)8=(110100.011)2
(3)二进制数与十六进制数之间的转换
二进制数转换为十六进制数的基本原理:由于十六进制数基数16为2的四次方(即16=24),因此,一个二进制数转换为十六进制数,如果是整数,只要从它的低位到高位每4位组成一组,然后将每组二进制数所对应的数用十六进制数表示出来。如果有小数部分,则从小数点开始,分别向左右两边按照上述方法进行分组计算,若小数部分最末组不足四位则后面补0。例如,将二进制数1101011.101转换为十六进制数,方法如下。
结果为(1101011.101)2=(6B.A)16
十六进制数转换为二进制数的基本原理:十六进制数转换为二进制数,只要从它的低位开始将每位上的数用二进制数表示出来。如果有小数部分,则从小数点开始,分别向左右两边按照上述方法进行转换。例如,将十六进制数6F.B4转换为二进制数,方法如下。
结果为(6FB4)16=(1101111.101101)2
(4)十进制数与十六进制数之间的转换
仿照十进制数转换为二进制数的方法,十进制数转换为十六进制数可采用“除16倒取余法”和“乘16取整法”,而在实际转换时,一般先将十进制数转换成二进制数,然后再将二进制数转换成十六进制数。
仿照二进制数转换为十进制数的方法将其按权展开求和即可,例如:
(2C.B)16=2×161+12×160+11×16-1=(44.6875)10
1.2.3 计算机中数据的单位
计算机数据的表示经常用到以下几个概念。
1.位
二进制数中的一个位(bit)简写为b,音译为比特,是计算机存储数据的最小单位。一个二进制位只能表示0或1两种状态中的一种,要表示更多的信息,就要把多个位组合成一个整体,一般以8个二进制位组成一个基本单位。
2.字节
字节是计算机数据处理的最基本单位。字节(Byte)简写为B,规定一个字节为8位,即1B=8bit。一般情况下,一个ASCI I码占用一个字节,一个汉字国际码占用两个字节。为了便于衡量存储器的大小,统一以字节(Byte,B)为单位。1KB(千字节)=1024B,1MB(兆字节)=1024KB,1GB(吉字节)=1024MB,1TB(太字节)=1024GB。
3.字(字长)
一个字通常由一个或若干个字节组成。字(word)是计算机进行数据处理时,一次存取、加工和传送的数据长度。由于字长是计算机一次所能处理信息的实际位数,所以它决定了数据处理的速度,是衡量计算机性能的一个重要指标,字长越长计算精度越高。
计算机型号不同,其字长也不同,常用的字长有8位、16位、32位和64位。一般情况下,IBM PC/XT的字长为8位,80286微型计算机的字长为16位,80386DX/80486微型计算机的字长为32位,Pentium系列微型计算机的字长为64位。
数据是计算机处理的对象,在计算机内部,各种信息都必须通过数字化编码后才能进行存储和处理。由于技术原因,计算机内部一律采用二进制数,而人们在编程中经常使用十进制数,有时为了方便还采用八进制数和十六进制数。理解不同的计数制及其相互转换是非常重要的。
1.2.4 计算机中常用的编码
在计算机中,各种信息都是以二进制编码的形式存在的。计算机之所以能区别这些信息的差异,是因为它们采用的编码规则不同。例如:同样是文字,英文字母与汉字的编码规则就不同,英文字母用的是单字节的ASCI I码,汉字采用的是双字节的汉字内码;但随着需求的变化,这两种编码有被统一的UNICODE码(由Unicode协会开发的能表示几乎世界上所有书写语言的字符编码标准)所取代的趋势,而图形、声音等的编码更复杂多样。因此,信息在计算机中的二进制编码是一个不断发展的、高深的、跨学科的知识领域。
1.字符编码
字符编码采用国际通用的ASCI I码,每个ASCI I码以1个字节(Byte)存储,从数字0到数字127代表不同的常用符号,例如大写字母A的ASCI I码值是65,小写字母a的ASCI I码值是97。由于ASCI I码只用了字节的低七位,最高位并不使用。后来,又将最高位编入这套编码中,成为8位的扩展ASCI I(Extended ASCI I)码,这套内码加上了许多外文和表格等特殊符号,成为目前常用的编码。基本的ASCI I字符集共有128个字符,其中有96个可打印字符,包括常用的字母、数字、标点符号等,另外还有32个控制字符,基本ASCI I字符与其十进制ASCI I值的对应关系如表1-4所示。标准ASCI I码使用7个二进位对字符进行编码,对应的ISO标准为ISO 646标准。
表1-4 基本ASCII字符与其十进制ASCII值的对应关系
字母和数字的ASCI I码的记忆是非常简单的。只要记住一个字母或数字的ASCI I码值,知道相应的大小写字母之间差32,就可以推算出其余字母或数字的ASCI I码值。
虽然标准ASCII码是7位编码,但由于计算机基本处理单位为字节(1Byte=8bit),所以一般仍以一个字节来存放一个ASCII字符。每一个字节中多余出来的一位(最高位)在计算机内部通常保持为0(在数据传输时可用作奇偶校验位)。由于标准ASCII字符集字符数目有限,在实际应用中往往无法满足要求。为此国际标准化组织制定了ISO2022标准,它规定了在保持与ISO 646兼容的前提下将ASCI I字符集扩充为8位代码的统一方法。ISO陆续制定了一批适用于不同地区的扩充ASCI I字符集,每种扩充ASCI I字符集分别可以扩充128个字符,这些扩充字符的编码均为高位为1的8位代码,称为扩展ASCI I码。
2.汉字的编码
(1)汉字内码
汉字信息在计算机内部也是以二进制编码方式存放的。由于汉字数量多,用一个字节的128种状态不能全部表示出来,因此在1980年我国颁布的《信息交换用汉字编码字符集——基本集》,即国家标准GB2312-80方案中规定用两个字节的十六位二进制表示一个汉字,每个字节都只使用低7位(与ASCI I码相同),即有128×128=16384种状态。由于ASCI I码的34个控制代码在汉字系统中也要使用,为防止发生冲突,不能作为汉字编码,128减去34只剩94种,所以汉字编码表的大小是94×94=8836,用以表示国标码规定的7445个汉字和图形符号。
每个汉字或图形符号分别用两位的十进制区码(行码)和两位的十进制位码(列码)表示,不足的地方补0,组合起来就是区位码。把区位码按一定的规则转换成的二进制代码叫作信息交换码(简称国标码)。国标码共有汉字6763个(一级汉字,是最常用的汉字,按汉语拼音字母顺序排列,共3755个;二级汉字,属于次常用汉字,按偏旁部首的笔画顺序排列,共3008个),数字、字母、符号等682个,共7445个。
由于国标码不能直接存储在计算机内,为方便计算机内部处理和存储汉字,又区别于ASCI I码,将国标码中的每个字节在最高位改设为1,这样就形成了在计算机内部用来进行汉字的存储、运算的编码叫作机内码(或汉字内码,或内码)。内码既与国标码有简单的对应关系,易于转换,又与ASCI I码有明显的区别,且有统一的标准(内码是唯一的)。
(2)汉字外码
无论是区位码还是国标码都不利于输入汉字,为方便汉字的输入而制定的汉字编码,称为汉字输入码。汉字输入码属于外码,不同的输入方法,形成了不同的汉字外码。常见的输入法有以下几类:
按汉字的排列顺序形成的编码(流水码):如区位码;按汉字的读音形成的编码(音码):如全拼、简拼、双拼等;按汉字的字形形成的编码(形码):如五笔字形、郑码等;按汉字的音、形结合形成的编码(音形码):如自然码、智能ABC。
输入码在计算机中必须转换成机内码,才能进行存储和处理。
(3)汉字字形码
为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码),如图1-5所示。
全部汉字字型码的集合叫做汉字字库。汉字字库可分为软字库和硬字库。软字库以文件的形式存放在硬盘上,现多用这种方式;硬字库则将字库固化在一个单独的存储芯片中,再和其他必要的器件组成接口卡,插接在计算机上,通常称为汉卡。
图1-5 汉字的点阵图及编码
用于显示的字库叫显示字库。显示一个汉字一般采用16×16点阵或24×24点阵或48×48点阵。已知汉字点阵的大小,可以计算出存储一个汉字所需占用的字节空间。例如:用16×16点阵表示一个汉字,就是将每个汉字用16行,每行16个点表示,一个点需要1位二进制代码,16个点需用16位二进制代码(即2个字节),共16行,所以需要16×2=32字节,即16×16点阵表示一个汉字,字形码需用32字节。汉字点阵所占的空间计算公式如下:
字节数=点阵行数×点阵列数/8
用于打印的字库叫打印字库,其中的汉字字型比显示字库多,而且工作时也不像显示字库需调入内存。
可以这样理解,为在计算机内表示汉字而统一的编码方式形成的汉字编码叫做内码(如国标码),内码是唯一的。为方便汉字输入而形成的汉字编码叫做输入码,属于汉字的外码,输入码因编码方式不同而不同,是多种多样的。为显示和打印输出汉字而形成的汉字编码叫做字形码,计算机通过汉字内码在字模库中找出汉字的字形码,实现其转换。
3.原码、反码和补码
原码、反码和补码是计算机存储数字的编码方式。由于计算机中只有加法运算器,没有减法运算器,因此当需要做减法运算时,就需要引入负数的概念,通过加上一个数的负数来达到减去这个数的目的,由此也就引入了符号位的概念。而原码、反码和补码就是由符号位、正号或负号以及二进制数值共同组成的。
(1)原码。原码是计算机中对数字的二进制定点表示法,它用最高位表示符号位,1表示负号,0表示正号,其他位存放该数的二进制的绝对值。以带符号位的四位二进制数1010为例,其最高位为1,表示这是一个负数,其他三位为010,即(0×22)+(1×21)+(0×20)=2,所以1010表示十进制数-2。由此可以得出:0的四位二进制原码是0000,其正数表示为0000,负数则表示为1000;1的四位二进制原码是0001,其正数表示为0001,负数表示为1001;2的四位二进制原码是0010,其正数表示为0010,负数表示为1010。以此类推。
(2)反码。反码是为了解决使用原码将一个数与其相反数相加时得到错误值而出现的。正数的反码与其原码相同,负数的反码则是除符号位外对正数逐位取反。例如,0的四位二进制反码,其正数是0000,负数是1111;1的四位二进制原码,其正数是0001,负数是1110;2的四位二进制原码,其正数是0010,负数是1101。以此类推。
(3)补码。补码是指一个数字作比特反相运算,再将结果加1。补码的最大优点是在加法或减法处理中不需因为数字的正负而使用不同的计算公式。正数的补码与其原码相同,负数的补码则是对其原码除符号位外逐位取反,然后整个数加1。例如,1的四位二进制补码,其正数是0001,负数是1111;2的四位二进制补码,其正数是0010,负数是1110,以此类推。0的正负数补码都是0000。
多媒体是文字、声音、图像、动画、视频等多种媒体信息综合在一起,并通过计算机进行综合处理和控制,能完成一系列交互式操作的信息技术。