第3章〓数据的表示与存储在数据处理中最常用到的基本概念就是数据和信息,它们既有区别又有联系。数据是用来描述客观事物的可识别的符号,这些符号既可以是数字,也可以是文字、声音、图形和图像等多种表现形式。信息是指经过加工处理可以产生影响的数据表现形式,这种数据形式对于接收者是有意义的。由此可见,数据是信息的载体,信息是数据处理的结果。数据处理的目的就是从原始数据中得到有用的信息。因此,数据处理也称信息处理。 显然,用计算机进行的数据处理,这些数据不仅仅是数值型数据,还包括非数值型数据。采用什么方法可以较好地解决数值型数据和非数值型数据的表示、处理、传输及存储就是本章要介绍的内容。 3.1数据在计算机中的表示3.1.1数制数制也称记数制,是用一组固定的符号和统一的规则来表示数值的方法。人们生活中买东西时使用的就是十进制,即逢十进一。但也有不使用十进制的时候,例如,时间有12小时制和24小时制;每星期有7天,第8天属于下周一等等。在不同的场合人们很自然地会使用不同的数制进行运算,以符合当时的习惯。计算机科学基础第3章数据的表示与存储实际上,在讨论数制时都会涉及两个基本要素: 基数和位权。 1) 基数 基数是指在某种进位记数制中,每个数位上能够使用数字的个数。例如,二进制的基数为2,每个数位上能够使用的数字符号为0、1;十进制的基数为10,每个数位上能够使用的数字符号为0~9。 表3.1为常见进制的表示方法。表3.1常见进制的表示方法 项目二进制八进制十进制十六进制数字符号0,10~70~90~9,A,B,C,D,E,F规则逢二进一逢八进一逢十进一逢十六进一基数281016位权2i8i10i16i表示方法BODH不同进制数的两种表示方法。 (1) 字母后缀。 例如,二进制数1010表示为1010B,八进制数23.45表示为23.45O,十进制数123.45表示为123.45D,十六进制数A1.23表示为A1.23H。一般来说,对于十进制数的后缀可以省略。 (2) 括号外面加下标。 例如,上述数值可表示为(1010)2、(23.45)8、(123.45)10、(A1.23)16。 再举个例子,我有两个苹果,用十进制表示就是(2)10,而用二进制表示就是(10)2。为什么数字不一样呢?因为使用了不同的记数规则,二进制“逢二进一”。但不管用什么样的计数规则,我的苹果还是两个,没多也没少,所以(2)10=(10)2就很好理解了。 注意: 以下内容中约定,十进制数按平时习惯均不做特别标注。 2) 位权 位权是指一个数字在某个固定位置上所代表的值,处在不同位置上的数字代表的值不同。例如,十进制数123,1的位权是100,2的位权是10,3的位权是1。位权与基数的关系: 各进制中位权的值是基数的对应位次幂。位幂次的排列方式以小数点为界,整数自右向左,最低位为基数的0次幂;小数自左向右,最高位为基数的-1次幂。任何一种数制表示的数都可以写成如下按位权展开的多项式之和。 例3.1将123.45、1010.11B、23.45O、A1.23H按位权展开。123.45=1×102+2×101+3×100+4×10-1+5×10-2(1010.11)2=1×23+0×22+1×21+0×20+1×2-1+1×2-2(23.45)8=2×81+3×80+4×8-1+5×8-2(A1.23)16=10×161+1×160+2×16-1+3×16-23.1.2二进制 众所周知,在计算机中处理、存放的数据都是以0和1的二进制编码形式存放的。采用二进制编码基于以下3个原因。 (1) 物理上容易实现,可靠性强。电子元器件大都具有两种稳定的状态,如电压的高与低,电路的通与不通等,这两种状态正好可以使用二进制数的0和1表示。 (2) 运算简单,通用性强。二进制的运算比十进制的运算简单,如二进制的乘法运算只有3种: 1×0=0×1=0,0×0=0,1×1=1。如果是十进制运算,则有55种情况。 (3) 计算机中二进制数的0、1数字与逻辑值“假”和“真”正好吻合,便于表示和进行逻辑运算。 对于数值型数据,都转换为二进制的形式。对于非数值型数据,如字符、文字、图形、声音、视频等,也要使用二进制进行编码表示为二进制数的形式,计算机才能对它们进行处理。此外,由于人们日常生活、工作当中使用的都是十进制数,而计算机内部采用的是二进制数,因此,计算机在输出处理结果时还应把二进制数转换成十进制数的形式。 3.1.3二进制运算 二进制数的算术运算与十进制数的算术运算一样,有加、减、乘、除四则运算,但运算更简单。 1. 二进制数的算术运算 (1) 二进制数加法、减法运算。 二进制数的加法运算规则: 0+0=0,0+1=1,1+0=1,1+1=10(向高位进位);两个二进制数相加时,每位最多有3个数: 被加数、加数和来自低位的进位数。 二进制数的减法运算规则: 0-0=0,0-1=1(向高位借位),1-0=1,1-1=0;两个二进制数相减时,每位最多有3个数: 被减数、减数和向高位的借位数。 (2) 二进制数乘法、除法运算。 二进制数的乘法运算规则: 0×0=0×1=1×0=0,1×1=1 二进制数的除法运算规则: 0/1=0,0/0和1/0(无意义),1/1=1 2. 二进制的逻辑运算 在逻辑代数里,表示“真”与“假”、“是”与“否”、“有”与“无”这种具有逻辑属性的变量称为逻辑变量。使用二进制数1表示“真”,0表示“假”,就可以将二进制数与逻辑取值对应起来。逻辑变量的取值只有两种: 真和假,即1和0。 逻辑运算有3种最基本的运算: 逻辑“或”、逻辑“与”和逻辑“非”。此外,还有“异或”运算等。计算机的逻辑运算是按位进行,没有进位或借位关系。 (1) 逻辑“或”运算。 逻辑“或”通常用符号+或∨表示。逻辑“或”运算规则如下: 0∨0=0,0∨1=1,1∨0=1,1∨1=1 只要两个逻辑变量中有一个为1,逻辑“或”的结果就为1;只有两个逻辑变量同时为0时,结果才为0。 例3.2X=(10100100)2,Y=(10111010)2,求X∨Y的结果。 10100100∨1011101010111110 即: X∨Y=(10111110)2 (2) 逻辑“与”运算。 逻辑“与”通常用符号·或∧表示。逻辑“与”运算规则如下: 0∧0=0,0∧1=0,1∧0=0,1∧1=1 只要两个逻辑变量中有一个为0,逻辑“与”的结果就为0;只有两个逻辑变量同时为1时,结果才为1。 例3.3X=(10100100)2,Y=(10111010)2,求X∧Y的结果。 10100100∧1011101010100000 即: X∧Y=(10100000)2 (3) 逻辑“非”运算。 逻辑“非”运算又称“求反”运算,通常在逻辑数据上面加一横线表示。对某数进行逻辑“非”运算,就是对它的各位求反,即0变为1,1变为0。 逻辑“非”运算规则: 0-=1,1-=0 例如,X=(10100100)2,则=(01011011)2。 在计算机中,逻辑数据的值用于判断某个条件是否成立,成立为1(真),不成立为0(假)。当要对多个条件进行判断时,就需要用逻辑变量和逻辑运算符把它们连接起来进行运算,结果为逻辑值。 在逻辑运算中,将逻辑变量的各种可能组合与对应的运算结果列成表格,这个表格称为真值表,它是全面描述逻辑运算关系的工具之一。一般在真值表中用1或T表示“真”(True),用0或F表示“假”(False)。 3.1.4进制的转换 由于计算机在进行数据处理时使用的是二进制,因此,其处理结果自然也是二进制数。如果计算机把这个处理结果以二进制数的形式输出(显示、打印)给用户,用户很可能看不懂,必须要把它(二进制结果)转换成平时采用的十进制数。 V3.1二进制与十进制转换 二进制只有0和1两个数字可以使用,而十进制有0~9十个数字可以使用,在相同位数的情况下,二进制数表示的数值范围比十进制数表示的数值范围小。例如,两位二进制数表示的数值有(00)2、(01)2、(10)2和(11)2共4个,而十进制数表示的数值有00、01、02、……、98、99共100个。由此可以看出,用二进制表示比较大一点的数,例如1000,需要的二进制位数比用十进制表示时需要的位数多很多,书写起来很不方便。为解决这个问题,可以采用八进制和十六进制来替代二进制,因为二进制、八进制、十六进制之间很容易相互转换。实际上在许多计算机应用软件中表示存储地址、颜色时,通常都是使用十六进制来描述的。 1. 二进制数、八进制数、十六进制数转换成十进制数 二进制数、八进制数、十六进制数转换成十进制数采用上述介绍的按位权展开方法,把各项相加即可。 例3.4将(101.01)2、(24.4)8、(35.C)16转换成十进制数。(101.01)2=1×22+0×21+1×20+0×2-1+1×2-2=4+0+1+0+0.25=5.25(24.4)8=2×81+4×80+4×8-1=16+4+0.5=20.5(35.C)16=3×161+5×160+12×16-1=48+5+0.75=53.752. 十进制数转换成二进制数、八进制数、十六进制数 (1) 整数部分: 除以基数取余数法。 整数部分的转换采用“除以基数取余数法”,即用基数多次除被转换的十进制数,直至商为0,每次相除所得余数,按照第一次除所得为最低位,最后一次除所得为最高位把余数排列起来,便可得到转换结果。 例3.5将十进制数13转换成二进制数。 〖JZ〗〖HL(3:1,Z〗2| 132| 6〓〓……1低位2| 3〓〓……02| 1〓〓……1〖KG*3〗〓0〓〓……1高位〖HL)〗〓〓〓〓〓〓〓〓〓即: 13=(1101)2 例3.6将十进制数156转换成八进制数和十六进制数。 即: 156=(234)8=(9C)16 〖JZ〗〖HL(8〗8| 156〓〓〓〓 16| 1568| 19〓……4低位 16| 9〓…… C低位8| 2〓 ……3〓0 ……9 高位〓0〓 ……2 高位〖HL)〗注意: 对于不同进制整数之间的互相转换,可以使用Windows操作系统提供的“计算器”很方便地解决。具体方法如下。 ① 单击Windows屏幕“开始”按钮,在弹出的程序列表中选择“计算器”命令,启动计算器。 ② 单击“计算器”窗口左上角的“打开导航”→“程序员”命令。 ③ 单击“计算器”窗口靠左上的基数列表中的基数(需要转换的数的基数),其中HEX表示十六进制,DEC表示十进制,OCT表示八进制,BIN表示二进制。 ④ 输入需要转换的整数,基数列表旁边会显示不同进制数的转换结果。 (2) 小数部分: 乘以基数取整数法。 用十进制小数乘以基数不断取整数,直至小数部分为0(对于不能为0的小数,只需达到所求精度即可)。所得的整数从小数点自左向右排列,首次取得的整数在最左。 例3.7将十进制数0.625转换成二进制数和八进制数。 0.6250.625×2 ×8 1.250 ……1高位5.000……5高位 ×2×8 0.500 ……00.160……0×2×81.000 ……1低位 1.280……1低位 即: 0.625=(0.101)2≈(0.501)8 由上述例题可以看出,当包含有小数的数值要转换成不同进制数时,很多情况下是无法实现精确转换的。 3. 二进制数、八进制数、十六进制数之间的转换方法 由于23=8,24=16,即1位八进制数所表示的范围与3位二进制数所表示的范围相同,1位十六进制数所表示的范围与4位二进制数所表示的范围相同,如表3.2所示。利用这个特点进行转换,方法就比较简单。表3.2二进制、八进制、十进制和十六进制的数据对应关系表 十进制二进制八进制十六进制00000001000111200102230011334010044501015560110667011177十进制二进制八进制十六进制810001089100111910101012A11101113B12110014C13110115D14111016E15111117F二进制数转换成八进制数的方法: 以小数点为界向左右两边进行分组,每3位为一组,不足3位就用0补足,每组用一个八进制数表示即可,简称“三合一”。同样,二进制数转换成十六进制数的方法: 以小数点为界向左右两边进行分组,每4位为一组,不足4位就用0补足,每组用一个十六进制数表示即可,简称“四合一”。 例3.8将二进制数(10110101.10101)2转换成八进制数和十六进制数。 (010 110 101.101 010)2=(265.52)8 (整数高位和小数低位分别补0) 2 65 5 2 (1011 0101.1010 1000)2=(B5.A8)16(小数低位补0) B 5A 8 同样,将八进制数转换成二进制数时,只需把每位八进制数拆分为3位二进制数,简称“一拆三”;将十六进制数转换成二进制数时,只需把每位十六进制数拆分为4位二进制数,简称“一拆四”。 例3.9将八进制数(123.25)8和十六进制数(38.D2)16转换为二进制数。 (123.25)8=(001 010 011.010 101)2=(1010011.010101)2 (38.D2)16=(0011 1000.1101 0010)2=(111000.1101001)2 整数最高位的0和小数最低位的0可以去掉。 当需要将八进制数和十六进制数相互转换时,可以先将其转换为二进制数,然后再将这个二进制数转换成对应的八(十六)进制数即可。 例3.10将八进制数(123.25)8转换为十六进制数。 (123.25)8=(001 010 011.010 101)2=(0000 0101 0011.0101 0100)2 0 5 354 即: (123.25)8=(53.54)16 3.1.5数值在计算机中的表示与存储 前面介绍了数制和二进制的基本运算规则,但在实际应用当中,参与算术运算的数据都是带有正、负符号的,多数都还带有小数,符号怎么表示?这些数据在计算机中如何存储?这些问题都有待解决,下面逐一介绍。 1. 机器数和真值 在计算机中,对于数学上的正(+)、负(-)号也只能使用二进制中的0和1两个数字表示。规定用0表示正,1表示负,因为计算机存储信息时是以字节为单位,符号就存放在该字节的最高位,称为符号位,也称数符。 例3.11一个8位二进制数-0110011,它在计算机中表示为10110011,如图3.1所示。 图3.1机器数这种把符号数值化了的数称为“机器数”,而它代表的数值称为该机器数的“真值”。在例3.11中,10110011为机器数,-0110011为该机器数的真值。 数值的符号经过数字化后就能被计算机识别了,但由于此时符号位和数值是一起存放的,数据在进行运算时,符号位如果参与一起运算,有时会产生错误的结果,见例3.12。 例3.12计算(-9)+6=?结果应为-3。可是在计算机中按照上述所说的符号位也一起参与运算,其结果为 10001001……-9的机器数+00000110……+6的机器数10001111……-15运算结果 显然这个结果是错误的。若要把符号位单独分开进行判断,反而把本来简单的运算变得复杂了。这就说明上述的方法只是解决了正数和负数的表示问题,没有解决数值运算的问题。通过分析可以看出,这都是由负数的符号位产生的问题,那么还有其他办法吗?实际上符号数还有多种的表示方式,常见的有原码、反码和补码方法。为简单起见,下面以整数、一字节为例说明。 (1) 原码。 原码的表示规则: 机器数的最高位表示符号位,正数的符号位为0,负数的符号位为1,其余各位是数值的绝对值,通常用[X]原方式表示。 例3.13整数X分别取不同的值时,给出其原码的表示结果。 [+1]原=00000001[-1]原=10000001 [+1011011]原=01011011[-1011011]原=11011011 [+127]原=01111111[-127]原=11111111 从上例可见,8位原码表示的最大值是正的127(即27-1),最小值是负的127。 这个方法就是前面采用的方法,简单方便,机器数与真值转换容易,但存在以下问题: ①数值0的表示有两种形式,[+0]原=00000000,[-0]原=10000000,给计算机判断带来不便; ②做算术运算时,符号位需要单独处理,增加了运算规则的复杂性,即增加了机器的设计成本。 (2) 反码。 反码的表示规则: 正数的反码就是其原码,负数的反码是符号位为1,其余各位按位取反,通常用[X]反方式表示。 例3.14设整数X分别取不同的值时,以下就是其反码的表示结果。 [+1]反=00000001[-1]反=11111110 [+91]反=01011011[-91]反=10100100 [+127]反=01111111[-127]反=10000000 从例3.14可见,8位反码表示方法与原码表示方法、数值表示范围都一样。同时,0也是有两种不同的表示形式,[+0]反=00000000,[-0]反=11111111,存在二义性。 虽然反码与原码从外观看有很大区别,但运算同样都不方便,一般只用于求补码的过程。 (3) 补码。 补码的表示规则: 正数的补码就是其原码,负数的补码是其反码在最低位加1,通常用[X]补方式表示。 例3.15设整数X分别取不同的值时,以下就是其补码的表示结果。 [+1]补=00000001[-1]补=11111111 [+91]补=01011011[-91]补=10100101 [+127]补=01111111[-127]补=10000001 补码表示方法中,0的表示方式是唯一的: [+0]补=00000000,[-0]补=00000000。 从上例可见,编码10000000没有使用,可以用来扩充补码所能表示的数值范围,即用它表示负128,那补码的数值范围就是-128~+127。当然[10000000]补中的最高位就比较特殊,既可看作符号位负数,也可作为数值位,其数值为-128,与原码、反码不同。下面看看补码的运算。 例3.16(-9)+15的运算。 11110111…… -9的补码+00001111……+15的补码 100000110……运算结果 运算结果的高位1丢弃,运算结果为[00000110]补,符号位为0,说明这是个正数,其对应的真值是它数值位的数值0000110,转换为十进制数是6,计算结果正确。 再看看补码的运算能否解决例3.12出现的问题。 例3.17(-9)+6的运算。 11110111……-9的补码+00000110……+6的补码11111101……运算结果 运算结果为[11111101]补,符号位为1,说明结果为负数。对负数的补码求其真值的方法,即对该补码的数值位再做一次求补操作即可。 [[11111101]补]补=10000011,即-0000011,转换为十进制数就是-3,运算结果正确。 计算机在执行数值运算时,运行的结果只能在补码表示数值的范围内,超出的数位(进位)只能丢弃。 例3.18(-9)+(-6)的运算。 11110111……-9的补码+11111010……-6的补码 111110001………运算结果 运算结果的高位1丢弃,剩余的8位[11110001]补,按照例3.16的方法可求出运算结果为十进制数-15。 例3.1990+60的运算。 01011010……90的补码+00111100……60的补码10010110……运算结果 运算结果[10010110]补的最高位为1,说明结果为负数。为什么两个正数相加的结果会是个负数呢?原因是这两个数相加的结果已经超出了使用一字节补码表示数值的范围(-128~+127),这种现象称为“溢出”。 从上述例子可见,利用补码方法可以很方便地实现正负数的加法运算,规则简单。只要参与运算的数据是在数值表示范围内,符号位同数值位一样参与运算而不需要单独考虑。如果运算的结果为正数,结果的真值就是其本身;否则,就对结果再次求补即可得到其真值。且允许产生最高位的进位(丢弃)。 此外,计算(-9)+6,这种一个负数加上一个正数的运算,实际上是可以将它改写成6-9的形式,即是将加法运算转换成为减法运算,这可以简化电路设计。实际上计算机就是使用补码进行加法、减法运算。图3.2时钟 对于利用补码实现减法转换为加法,不妨看看日常生活中熟悉的例子。如图3.2所示,假定时间采用12小时制,由于时钟出现故障,现在的时间应该是上午1点,但时钟显示的时间是3点。为了重新调整时钟,该怎么做?有两种方法。第一种方法是把时针向逆时针方向拨2小时;第二种方法是把时针向顺时针方向拨10小时,都可以达到目的。 这里,先设定时针往顺时针方向为正,逆时针方向为负。按第一种方法就很好理解,就是3-2=1;第二种方法就是3+10=13,因为采用的是12小时制即十二进制,逢十二进一,高位丢弃,余数为1,就是1点。同样,有其他错误时间也一样可以使用这两种方法进行校准。 由于时钟超过12的表示,相当于舍弃了进位,可以看到: 3-2等同于3+10,3-1等同于3+11,9-4等同于9+8,…。在十二进制中(不考虑进位,即减去模),上述式子中的-2、-1、-4可以用+10、+11、+8代替,即减法变成加法。 可以从上述例子得出一个结论:若两个数a、b之和等于R,则称a和b互为“补数”(补码),R称为模。上面例子中,10和2、11和1、8和4就是以12为模的互为补码。可以看出,求a的补码b时,直接用R-a即可,有了b可以方便地把减法运算转换为加法运算,例如上面的式子3-2,先求出2的补码,即12-2=10,所以3-2可以转换为3+10=13,丢弃模12,13-12=1,得出结果为1。 模R的取值是指定数值范围中包含的整数个数。上面时钟例子,时钟共有12小时,故R的取值为12。计算机中的数据都是采用定长方式存储,8位二进制能表示的整数有28=256,R=256,推广到n位二进制,即R=2n。以一字节为例,看看利用模R求补码的方法,能否在二进制和十进制中实现减法运算转换为加法运算。 例3.20105-83的运算。 方法一,采用十进制方法,8位二进制能表示的整数有28=256,所以R=256。按照公式R=a+b,已知a=83,求得b=R-83=256- 83=173。 所以105-83可转换为105+173=278,丢弃模256,278-256=22,得出的结果正确。 方法二,采用二进制补码方法。 01101001…… 105的补码+10101101……-83的补码100010110……运算结果 丢弃高位进位1,运算结果[00010110]补的符号位是0,说明结果是正数,其真值就是(10110)2,转换为十进制就是22,结果正确。 由此可见,在指定范围内,用补码方法实现减法运算转换成加法运算不但适用于二进制,在其他进制中也同样适用。 2. 实数在计算机中的表示 解决了数的符号表示和运算问题,接下来就要解决实数存储问题,之前讨论的数值都没有涉及小数,实际应用中经常使用的是实数,要采用什么样的形式存放?计算机中小数点是不占数位的,因此,就要规定小数点的位置来表示数值,分为定点整数、定点小数和浮点数3种形式。 (1) 定点整数。 定点整数规定小数点的位置在最低位的右边,这种方法表示的数为纯整数,如图3.3所示。图3.3定点整数表示 (2) 定点小数。 定点小数规定小数点的位置在符号位的右边,这种方法表示的数为纯小数,如图3.4所示。 (3) 浮点数。 在计算机中定点数通常只用于表示纯整数或纯小数,其数值表示范围很有限,在实际应用中远远不够,尤其是在科学实验中需要表示特别大或者特别小的数值时,这时就要采用类似科学记数法的形式,称为浮点数表示,如图3.5所示。 图3.4定点小数表示 图3.5浮点数表示 浮点数由阶码和尾数组成: 阶码用定点数表示,阶码所占的位数确定了数值的范围;尾数用定点小数表示,尾数所占的位数确定了数值精度,即小数点后有效位数。因此,实数就是用浮点数来表示和存储的。 为了唯一地表示浮点数在计算机中的存储,对尾数采用了规格化的处理,规定尾数的最高位为1,即所有规格化数必须转换成±0.1×××…××××2±p形式,其中p是指数(即阶码),最终也要转换为二进制数,对于不符合要求的可以通过阶码调整。 IEEE在1985年制定了IEEE 754标准,统一浮点数的存储格式。因此,在程序设计语言中比较常见的有以下两种类型的浮点数。 ① 单精度浮点数(Float或Single)占4字节,其中阶符占1位,阶码占7位,尾符占1位,尾数占23位。 ② 双精度浮点数(Double)占8字节,其中阶符占1位,阶码占10位,尾符占1位,尾数占52位。 可见双精度浮点数比单精度浮点数占用的存储空间更大,表示的数值范围更广,且精度更高。 例3.2136.5采用单精度浮点数在计算机中的存储形式如图3.6所示。 图3.6单精度浮点数存储格式 规格化表示: 36. 5=100100.1B=0.1001001×26B=0.1001001×2110BB 从十进制数转换成二进制数的过程,要使十进制实数完全转换为二进制实数,十进制实数的小数部分最后一位必须是5(当然这是必要条件,并非充分条件),所以,一个十进制小数能用浮点数精确地表示,其小数部分的要求也是一样的。 3.2字符的编码 字符包括西文字符(英文字母、数字、各种常用符号)、中文字符和一些特殊控制字符。计算机中的数据都是以二进制的形式存储和处理的,因此,字符也必须按特定的规则用二进制进行编码,即数字化后才能输入计算机进行处理。字符编码的方法: 先确定需要编码的字符,把它们按一定的规律排好顺序,然后就可以开始从头到尾进行编码。当然,编码的长度与字符的总数有关,字符越多,长度越长。 3.2.1ASCII码 对于英文字符的编码,最常用的是美国信息交换标准代码(American Standard Code for Information Interchange,ASCII)。它是由美国国家标准研究所(American National Standards Institute,ANSI)制定的,供不同计算机在相互通信时共同使用,后来它被国际标准化组织(International Organization for Standardization,ISO)定为国际标准,称为ISO 646标准。ASCII码采用7位二进制编码,共有27=128种不同的组合,可以表示128个字符,包括10个数字字符0~9、52个大小写的英文字母以及特殊字符和控制字符,详见附录A。 由附录A可以看到,ASCII表的基本规律如下。 (1) 十进制码值0~32和127,即表中的NUL~SP和DEL共34个字符为非图形字符(也称控制字符,不可见),其余94个字符为图形字符,可显示出来。 (2) 字符0~9、A~Z、a~z的码值都是按从小到大顺序排列。 (3) 数字字符的码值小于英文字符。 (4) 小写字母比大写字母的码值大32,为大小写字母的相互转换提供了方便。 计算机内信息的存储和处理是以字节(8个二进制位)为单位来进行操作,因此,一个字符在计算机内实际上是用8位二进制数表示。正常情况下,一个英文字符的ASCII码的最高位d7为0。在需要进行奇偶校验时,这一位可用于存放奇偶校验码,这时称这一位为奇偶校验位。 英文字符除了常用的ASCII码外,还有BCD码(BinaryCoded Decimal),它将十进制数的每位分别用4位二进制数表示,又称二十进制编码;还有另一种EBCDIC码(Extended Binary Coded Decimal Interchange Code),即扩展的二十进制交换码,这种编码主要在大型计算机中使用。 3.2.2汉字的表示 GB 2312—1980《信息交换用汉字编码字符集 基本集》收集和定义了6763个汉字及682个拉丁字母、俄文字母、汉语拼音字母、数字和常用符号等,共7445个汉字和字符。其中使用频度较高的3755个汉字为一级汉字,按汉字拼音字母顺序排列,使用频度较低的3008个汉字为二级汉字,按部首排列。 V3.2汉字的编码 汉字字符比ASCII码表中的字符多很多,因此其编码比英文字符编码复杂。要在计算机中处理汉字,需要解决汉字的输入、处理、输出以及汉字的存储、传输等如下问题。 (1) 键盘上无汉字,不能直接利用键盘输入,需要输入码来对应。 (2) 汉字在计算机中的存储需要机内码来表示,以便存储、处理。 (3) 汉字量大、字形变化复杂,需要用对应的字库来存储。 计算机汉字处理流程如下(见图3.7)。 图3.7汉字处理流程 (1) 将汉字以输入码方式输入计算机中。 (2) 将输入码转换成计算机能够识别的汉字机内码进行处理、存储。 (3) 将机内码转换成汉字字形码输出。 1. 汉字输入码 汉字输入码是指从键盘上输入汉字时采用的编码,又称外码。汉字输入码有多种,目前采用较多的有: 以拼音为基础的编码方案,例如“微软拼音”“搜狗拼音”等;字形编码方案,例如“微软五笔”“搜狗五笔”等。汉字输入码进入到计算机后必须转换成机内码。 2. 汉字交换码(国标码)和机内码 1980年,我国颁布了汉字编码的国家标准GB 2312-1980,这个字符集是我国中文信息处理技术的发展基础,也是目前国内所有汉字系统的统一标准,GB 2312-1980称为国标码。GB 2312-1980规定每个汉字用2字节的二进制编码,每字节的最高位为0,其余7位用来表示汉字信息。为保证中、英文字符兼容,在计算机内部能区分ASCII字符和汉字,将汉字国标码的2字节二进制编码的最高位置1,从而得到对应的汉字机内码。汉字机内码是汉字在计算机内部被存储、处理和传输时使用的编码,简称内码。表3.3为中/英文字符的编码方案。表3.3中/英文字符的编码方案 ASCII码: 0ASCII码低7位国标码: 0第一个字节低7位0第二个字节低7位机内码: 1第一个字节低7位1第二个字节低7位例如,汉字“阿”的国标码2字节二进制编码为00110000B和00100010B,对应的十六进制数为30H和22H;而其机内码的2字节二进制编码为10110000B、10100010B,对应的十六进制数为B0H和A2H。 计算机处理字符数据时,如遇到最高位为1的字节,则可将该字节连同其后续最高位也为1的另一字节看作1个汉字的机内码;如遇到最高位为0的字节,则可将其判定为一个ASCII英文字符,这样就实现了汉字、英文字符的共存。 GB 18030全称《信息技术 中文编码字符集》,是中华人民共和国国家标准所规定的变长多字节字符集。其对GB 2312—1980完全向后兼容,与GBK基本向后兼容,并支持Unicode(GB 13000)的所有码位。GB 18030当前版本为GB 18030—2005,该标准规定了信息技术用的中文图形字符及其二进制编码的十六进制表示。 Unicode(统一码、万国码)在1992年被国际标准化组织确定为国际标准ISO 10646,成为可以用于表示世界上所有文字和符号的字符编码方案。目前,所有的计算机都支持Unicode。Unicode用一些基本的保留字符制定了三套编码方式,分别是UTF8、UTF16和UTF32,UTF是Unicode Transformation Format的缩写。在UTF8中,字符是以8位二进制即一字节来编码的。用一或几字节表示一个字符,这种方式的最大好处是保留了ASCII字符的编码作为它的一部分。而其他字符,例如中国、日本、韩国等大部分常用字,使用3字节编码;UTF16和UTF32分别是Unicode的前16位和前32位编码方式。 以上介绍的只是简体字的编码方式,繁体字的编码方式与简体字的编码方式不同,所以,在使用一些应用软件或者浏览网页时会出现乱码现象,如图3.8所示。 图3.8汉字乱码如果浏览网页时出现乱码,可以右击页面,在弹出的快捷菜单中选择“编码”→Unicode(UTF8)即可。乱码的原因很可能是选择了“中文(简体)(GBK)”造成的。如果还不成功那就是编码选择错了,要通过查看网页源文件头部,看一下网页的编码设置是哪一个,改成相应的即可。同理,如果是应用软件编辑窗口(如网页制作软件)内容乱码,通过应用软件的菜单中“编码”命令重新设置即可。 3. 汉字字形码 汉字字形码又称汉字字模,用于汉字在显示屏或打印机输出。汉字字形码通常有两种表示方式: 点阵方式和矢量方式。 用点阵表示汉字时,汉字字形码指的是这个汉字字形点阵的代码。根据输出汉字的要求不同,点阵的多少也不同。常用的点阵有16×16、24×24、32×32、64×64或者更高。图3.9是“景”字的24×24点阵字形显示图。有笔画的小方格用二进制数1表示,没有笔画的小方格用二进制数0表示。显然,点阵规模越大字形越美观,但它所占的存储空间也越大。以16×16点阵为例,每个汉字字形就要占用32字节(16×16/8=32字节),7400多汉字和字符大约占用256KB。如果觉得16×16点阵不够精细,可以把每个格子分成两半成为32×32(即提高了分辨率),每个汉字要占用的字节数就是32×32÷8=128字节,比原来多了3倍存储空间。因此,字形点阵只能用来构成汉字库,一般存储在硬盘上,当要显示输出时才调入内存进行处理、输出,而不长驻内存当中。 图3.9“景”字的24×24点阵 矢量方式存储的是描述汉字字形的轮廓特征,当要输出汉字时,通过计算机的计算生成所需大小和形状的汉字。矢量化字形与最终文字显示的大小、分辨率无关,因此产生高质量的汉字输出。 点阵方式和矢量方式的区别: 前者编码、存储方式简单,无须转换直接输出,但字形放大后产生的效果差;矢量方式特点正好与前者相反。 3.3多媒体数据的表示 媒体是指承载或传递信息的载体。在日常生活、工作当中,报纸、图书、杂志、广播、电影、电视均是媒体,都以它们各自的媒体形式传播信息。它们中有的以文字作为媒体,有的以声音作为媒体,有的以图像作为媒体,还有的将文字、图像、声音结合在一起作为媒体。同样的信息,在不同领域中采用的媒体形式也可以不同。 在信息领域中,多媒体是指文本、图形、图像、声音、影像等这些媒体和计算机程序融合在一起形成的信息媒体,运用存储与再现技术得到的计算机中的数字信息。 多媒体信息处理是指对文字、声音、图形、图像等多媒体信息在计算机运算下的综合处理。在传统媒体中,声音、图形、图像等媒体几乎都是以模拟信号的方式进行存储和传播的,而在计算机多媒体系统中将以数字的形式对这些信息进行存储、处理和传播。 3.3.1图形与图像 在计算机科学中,图形(Graphics)和图像(Image)两个概念是有区别的。 图形(见图3.10(a))一般指用计算机软件绘制的由直线、圆、圆弧、任意曲线等图元组成的画面,以矢量图形文件形式存储。矢量文件中存储的是一组描述各个图元的大小、位置、形状、颜色、维数等属性的指令集合,通过相应的绘图软件读取这些指令可将其转换为输出设备上显示的图形。因此,矢量图文件的最大优点是对图形中的各个图元进行缩放、移动、旋转而不失真,且占用的存储空间小。图形多用于计算机辅助设计(CAD)、三维动画创作等。 图3.10图形与图像 图像(见图3.10(b))则是指由输入设备(如扫描仪、数码相机等)捕捉的实际场景画面,经数字化后以位图形式存储的画面。位图文件中存储的是构成图像的每个像素点的亮度、颜色,位图文件的大小与分辨率和色彩的颜色种类有关,放大、缩小会失真,占用的空间比矢量文件大。 图像有多种分类方法,按照图像数据的表示方法,主要分为位图图像和矢量图像。位图图像也称点阵图像或栅格图像,是由像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样,其存储形式就像前面介绍汉字字形码一样(见图3.9),每像素占一个小方格存储,用一个二进制位表示,像素的颜色也是用若干个二进制位表示(以字节为单位,如1字节可以表示256种颜色,常说的真彩颜色是用3字节表示颜色),然后把这些点位像素数据存储在计算机中。位图的缺点和点阵汉字一样,放大时会失真。数码照相机拍摄的照片就是数字化后存储在照相机的存储卡中。矢量图和矢量汉字一样,存储的不是像素数据,而是存放各种图形元素(如点、线、圆、矩形等对象数据),包括颜色、形状、轮廓、大小等数据。因此,矢量图形数据量与图像的复杂程度有关,与图像的分辨率无关,所以图像放大时不会失真。图3.11为放大后的位图与矢量图。 图3.11放大后的位图与矢量图 由图元/线条组成的图形,如工程图、三维造型或艺术字等,特别适合用于文字设计、图案设计、版式设计、标志设计、工艺美术设计、插图等,较多用在工程作图软件,如AutoCAD。位图可以表现的色彩比较多,表现力强、细腻、层次多、细节多,能够制作出颜色和色调变化丰富的图像,可以逼真地表现自然界的景观,特别适合制作由无规律的像素点组成的图像,如风景、人物、山水等,一般较多用Photoshop软件处理。但位图图像在缩放和旋转时会产生失真现象,同时文件较大,对内存和硬盘空间容量的需求较高。总之,图形、图像技术是相互关联的,把图形处理技术和图像处理技术相结合可以使视觉效果和质量更加完善。 1. 图像的数字化 现实中的图像都是模拟信号,是不能直接用计算机进行处理的,需要转换成用一系列的0、1数字所表示的数字图像,这个过程就是将模拟图像数字化,通常用采样、量化和编码方法来解决。 1) 采样 采样就是将二维空间上连续的图像转换成离散点的过程,采样的实质就是用多少个像素(Pixels)点来描述这一幅图像,称为图像的分辨率,用“列数×行数”表示,分辨率越高,图像越清晰,存储容量也就越大。 2) 量化 量化是在图像离散化后,将表示图像色彩浓淡的连续变化值离散化为整数值的过程。把量化时所确定的整数值取值个数称为量化级数,表示量化的色彩值(或亮度)所需的二进制位数称为量化字长。一般可用8位、16位、24位或以上来表示图像的颜色,24位可以表示224=16 777 216种颜色,称为真彩色。量化字长越大,越能真实地反映原有图像的颜色,但得到的数字图像的存储容量也越大。 在多媒体计算机中,图像的色彩值称为图像的颜色深度,有3种表示方式。 (1) 黑白图: 图像的颜色深度用一个二进制位1和0分别表示纯白、纯黑两种状态。 (2) 灰度图: 图像的颜色深度用一字节表示,灰度级别就有256(28=256)级,通过调整黑白两色的程度(称为灰度)来显示单色图像。 (3) RGB(Red、Green、Blue,三原色): 24位真彩色显示时,由红、绿、蓝三原色通过不同的强度混合而成。强度分为256级,占24位(3字节),就构成了224=16 777 216种“真彩色”图像。 3) 编码 将采样和量化的数据转换成为二进制数的表示形式。 图像的分辨率和像素位的颜色深度决定图像文件的大小,即图像的质量,其计算公式为 列数×行数×颜色深度÷8=图像字节数 例3.22要表示一个分辨率为1024×1024的24位“真彩色”图像,则图像大小为 1024×1024×24÷8b=3MB 这仅仅是一张数字化后的图像存储容量,可见其数据量巨大,无论是存储还是传输都不方便,必须采用压缩技术解决。 2. 图形的存储 图形文件是一种以数学的方式对图形进行描述,在原制作软件和库文件的环境下,通过计算机可以任意缩放图形,又不损失其细节的文件。 矢量图形通常由直线、圆、弧线等各种矢量对象组成,图形中的每个对象都是一个独立的实体,都独立地定义了各自的色彩、形状、轮廓、尺寸以及位置等属性,通过数学方法将这些矢量对象组合而成的图形,以一组指令的形式保存。对于图像中更为复杂的曲面、光照、材质等效果,同样也是使用这种形式保存。 矢量图形的特性如下。 (1) 由于矢量图形把线段、形状及文本定义为数学方程,因此矢量图形与分辨率无关,对图形的展现更为细致、真实。它可以将图形的尺寸任意改变而不会导致失真和降低图形的质量。这是矢量图形一个非常有用的特点。 (2) 由于矢量图形与分辨率无关,因此矢量图形可以自动适应输出设备的最大分辨率。以打印机作为输出设备时,打印机把矢量图形的数学方程变成打印机的像素,无论打印的图形有多大,图形看上去都十分均匀清晰。 (3) 由于矢量图形是以数学方法描述的图形,它并不存储图形的每一点,而只存储图形内容的轮廓部分,因此矢量图形的存储空间较位图图像的存储空间要小得多。 (4) 在矢量图形中,文件大小取决于图形中所包含对象的数量和复杂程度,因此矢量图形文件大小与输出图形的大小几乎没有关系,这一点与位图图像正好相反。 (5) 在矢量图形中可以只编辑其中某个对象而不影响图形中的其他对象。矢量图形中的对象可以互相覆盖而不会互相影响。 3. 常见图形和图像文件格式 1) BMP(.bmp) BMP(Bitmap)是一种与设备无关的图像文件格式,是Windows环境中经常使用的一种位图格式。其特点是包含的图像信息较丰富,几乎不进行压缩,故文件占用空间较大。大多数图像处理软件都支持此格式。 2) JPEG(.jpg或.jpeg) JPEG是由联合照片专家组(Joint Photographic Experts Group)开发的。它既是一种文件格式,又是一种压缩技术。JPEG作为一种灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例压缩图像文件。它用有损压缩方式去除冗余的图像和彩色数据,在获得极高压缩率的同时也能展现十分丰富生动的图像。JPEG应用非常广泛,大多数图像处理软件均支持此格式。 JPEG 2000作为JPEG的升级版,其压缩率比JPEG高约30%,同时支持有损和无损压缩。JPEG 2000格式有一个极其重要的特征是它能实现渐进传输,即先传输图像的轮廓,再逐步传输数据,不断提高图像质量,让图像由朦胧到清晰显示。此外,JPEG 2000还支持“感兴趣区域”特性,可以任意指定影像上感兴趣区域的压缩质量,还可以选择指定的部分先解压缩。JPEG 2000和JPEG相比优势明显,且向下兼容,因此可取代传统的JPEG格式。 3) GIF(.gif) GIF(Graphic Interchange Format)是CompuServe公司开发的图像文件格式,采用了压缩存储技术。GIF同时支持线图、灰度和索引图像,但最多支持256种色彩的图像。其特点是压缩比高、磁盘空间占用较少、下载速度快,可以存储简单的动画,被广泛用于Internet中。 4) PNG(.png) PNG(Portable Network Graphics,可移植的网络图像)是流式图像文件。压缩比高,并且是无损压缩,适合在网络中传播,但是它不支持动画功能。 5) WMF(.wmf) WMF(Windows Metafile Format)是Windows中常见的一种图元文件格式,它属于矢量图形,其特点是文件非常小,可以任意缩放而不影响图像质量,整个图形常由各个独立的组成部分拼接而成,但其图形往往较粗糙。Windows中许多剪贴画图像以该格式存储,广泛应用于桌面出版印刷领域。 6) SVG(.svg) SVG(Scalable Vector Graphics)是一种基于XML,由World Wide Web Consortium(W3C)开发的,开放、标准的矢量图形文件。它可以使图像在改变尺寸的情况下,图形质量不会有损失。与JPEG和GIF图像比起来,其尺寸更小,可压缩性更强,方便下载。文本在SVG图像中保留可编辑和可搜寻的状态,可用任何文字处理工具打开SVG图像,直接用代码来描绘图像,也可以通过改变部分代码使图像具有交互功能,并随时插入HTML中通过浏览器观看。它还可以在任何分辨率下被高质量地打印,非常适用于设计高分辨率的Web图形页面,是目前比较流行的图像文件格式。 3.3.2音频 声音是通过空气振动发出的,在介质中传播时,实际上是一种波,称为声波,通常用模拟波的方式表示。声波的物理元素包括振幅、频率: 振幅决定了音量,频率决定了音调。音频是声音的信息表示,通常指在20~20 000Hz频率范围的声音信号,是连续变化的模拟信号,而计算机只能处理数字信号,必须把它转换成数字信号计算机才能处理,这就是音频的数字化,如图3.12所示。 图3.12音频的数字化过程 1. 音频的数字化 音频的数字化过程要经过采样、量化和编码。采样和量化的过程可由模数转换器(AnalogtoDigital Converter,ADC)实现。ADC以固定的频率采样、量化,经采样和量化的声音信号再经编码后就成为数字音频信号,以数字声波文件形式保存在计算机存储介质中。若要将数字音频输出,则通过数模转换器(DigitaltoAnalog Converter,DAC)将数字信号转换成原始的模拟信号即可。 在数字化过程中,采样频率、采样精度(量化位数)和声道数是非常重要的指标。采样频率是指每秒要采集多少个声音样本,频率越高,声音的保真度越高,声音的质量就越好。一般使用的频率为11.025kHz(语音效果)、22.05kHz(音乐效果)、44.1kHz(高保真效果)。采样精度是指每个声音样本需要用多少个二进制位来表示,它反映声音波形幅度的精度,一般分为8位采样、16位采样。样本位数的多少影响声音的质量,位数越多,声音的质量就越好。声道数是指使用的声音通道个数,用来表明声音记录是产生一个波形还是两个波形,即通常所说的单声道、立体声。图3.13为采用16位和24位的音频采样。 图3.13采用16位和24位的音频采样