数据在计算机中的表示

数据在计算机中的表示

计算机所表示和使用的数据可分为两大类:数值数据和字符数据。数值数据用以表示量的大小、正负,如整数、小数等。字符数据也叫非数值数据,用以表示一些符号、标记,如英文字母A~Z、a~z,数字0~9,各种专用字符+、-、*、/、[、]、$2、$3等及标点符号等。汉字、图形、声音数据也属非数值数据。

任何形式的数据,无论是数字、文字、图形、图像、声音、视频,进入计算机都必须进行二进制编码转换。

一、数据与信息

数据是对客观事物的符号表示。数值、文字、语言、图形、图像等都是不同形式的数据。信息是现代生活和计算机科学中一个非常流行的词汇。信息既是对各种事物变化和特征的反映,又是事物之间相互作用、相互联系的表征。人们通过接收信息来认识事物,从这个意义上来说,信息是一种知识,是接收者原来不了解的知识。

计算机科学中的信息通常被认为是能够用计算机处理的有意义的内容或消息,它们以数据的形式出现,如数值、文字、语言、图形、图像等。数据是信息的载体。

数据于信息的区别是:数据处理之后产生的结果为信息,信息具有针对性、时效性。尽管这是两个不同的概念,但人们在许多场合把这两个词汇互换使用。信息有意义,而数据没有。

信息同物质、能源一样重要,是人类生存和社会发展的三大基本资源之一。可以说信息不仅维系这社会的生存和发展,而且在不断地推动着社会和经济发展。

二、计算机中的数据

ENIAC计算机是一台十进制的计算机,它采用十个真空管来表示一位十进制数。冯·诺依曼在研制IAS时,发觉这种十进制的表示和实现方式十分麻烦,提出了二进制的表示方法,从此改变了整个计算机的发展历史。

二进制只有“1”和“0”两个数,相对十进制而言,采用二进制表示不但运算简单、易于物理实现、通用性强,更重要的优点是所占用的空间和所消耗的能量要小得多,机器可靠性高。

计算机内部均用二进制数来表示各种信息,但计算机与外部交往仍采用人们熟悉和便于阅读的形式,如十进制数据、文字显示以及图形描述等。其间的转换,则由计算机系统的硬件和软件来实现。

三、计算机中数据的单位

计算机中数据的最小单位是位(即一个二进制位)。存储容量的基本单位是字节。8个二进制位称为1个字节,此外还有KB、MB、GB、TB等。

(一)位(bit)

位是度量数据的最小单位,在数字电路和电脑技术中采用二进制,代码只有0和1,其中无论0还是1在CPU中都是1位。

(二)字节(Byte)

一个字节由八位二进制数字组成(1Byte=8bit)。字节是信息组织和存储的基本单位,也是计算机体系结构的基本单位。

为了便于衡量存储器的大小,统一以字节(Byte,B)为单位。常用的是:

千(K)字节 1KB=1024B

兆(M)字节 1MB=1024KB

吉(G)字节 1GB=1024MB

太(T)字节 1TB=1024GB

(三)字长

人们将计算机一次能够并行处理的二进制位称为该计算机的字长。字长是计算机的一个重要指标,直接反映一台计算机的计算能力和计算精度。字长越长,计算机的数据处理速度越快。

四、数制的基本概念

人们日常生活中使用到的数制很多,如我们最熟悉的1斤等于10两(十进制),1年等于12个月(十二进制),1分钟等于60秒(六十进制)等。而计算机科学中经常使用二进制、八进制、十进制和十六进制等,所有的数制我们统称为R进制数。但是在计算机内部,不管什么样的数都使用二进制编码形式来表示。我们首先介绍几个有关数值的基本概念。

(一)数码

在一种计数制中,只能使用一组固定的数字符号来表示数目的大小,这些数字符号称为该计数制的数码。例如在十进制中,我们用0、1、2、3、4、5、6、7、8、9这十个符号来表示所有的十进制数,那么0-9被称为十进制数的数码;而我们用0和1来表示二进制数,那么0和1被称为二进制数的数码。

(二)基数

一个计数制所包含的数码的个数称为该计数制的基数,用R表示。例如,二进制数的数码是0和1,则二进制数的基数R为2;十进制数的数码是0-9,则十进制数的基数R为10。

(三)位值(权)

在任意一种计数制数值中,数码所处的位置不同,代表的数值大小也不同。例如,十进制数777,同一个数码7,因位置不同而意义不同,左起第一个7表示700个(7个100),中间的7表示70个(7个10),最右边的7表示7个(7个1)。因位置的不同我们由右向左将各数码所在的位置称为个位(100)、十位(101)、百位(102)。任意一个R进制数都是由一串数码组成,其中每一个数码所表示的实际值大小,除数码本身的数值外,还与它所处的位置有关,由位置决定的值就称为位值$2或位权)。

任一进制数都可以写成按权展开的形式。例如,十进制数2786.39可以按权展开为如下的和:

$22786.39$3D=2×103+7×102+8×101+6×100+3×10-1+9×10-2

式中:103,102,101,100,10-1,10-2等即为每一位的位权(10i,其中i的取值方法为:任意一种数值整数部分最低位i取0,向左依次递增,向右依次递减),每一位的数码与该位的权的乘积就是该位的数值。

(四)进位原则

在所有进制数中都有一个进位原则,就是R进制一定是“逢R进一”。如十进制数的进位原则就是“逢十进一”,二进制就是“逢二进一”,八进制就是“逢八进一”,十六进制就是“逢十六进一”。

表1  常用数制表

五、数制转换

(一)非十进制数转成为十进制数

利用按权展开的方法,可以把任意数制的数转化成十进制数。例如:

$21010.101$3B=l×23 +0×22+1×21+0×20+1×2-1+0×2-2+1×2-3

=8+0+2+0+0.5+0+0.125

=$210.625$3D

只要掌握了数制的概念,那么将任意R进制数转化成十进制数的方法都是一样的。

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

十进制整数转换成二进制整数,其方法是采用“除2取余”法。具体步骤是:把十进制整数除以2得一商数和一余数;再将所得的商除以2,又得一个新的商数和余数;这样不断地用2去除所得的商数,直到商等于0为止。每次相除所得的余数便是对应的二进制整数的各位数码。第一次得到的余数为最低有效位,最后一次得到的余数为最高有效位。图1为将十进制数100转换为二进制数,结果为$2100$3D=$21100100$3B。

图1 除2取余

把十进制小数转换成二进制小数,方法是“乘2取整” ,其结果通常是近似表示。

上述方法同样适用于十进制数向十六进制数的转换,只是使用的基数不同。

(三)二进制数转换成为八进制数

二进制数转换为八进制数遵循“三合一”原则,只要将二进制数从小数点开始,整数部分从右向左3位一组,小数部分从左向右3位一组,最后不足3位补0,然后将每一组二进制数转换为十进制数即可。例如:

$21100111.1$3B =(001  100  111.  100)B

=(1    4    7 .    4 )D

=(147.4)O

(四)二进制数转换成为十六进制数

同理,二进制转换为十六进制遵循“四合一”原则,然后将每一组二进制数转换为十进制数,最后再把十进制数转换为十六进制数即可。例如:

$21101100111011$3B  =(0001  1011  0011  1011)B

=(1     11    3    11   )D

=(1B3B)H

六、 西文字符的编码

字符包括西文字符(字母、数字、各种符号)和中文字符,即所有不可做算术运算的数据。由于计算机是以二进制的形式存储和处理的,因此字符也必须按特定的规则进行二进制编码才能进入计算机。字符编码的方法很简单,首先确定需要编码的字符总数,然后将每一个字符按顺序确定顺序编号,编号值的大小无意义,仅作为识别与使用这些字符的依据。字符形式的多少涉及编码的位数。对西文与中文字符,由于形式的不同,使用不同的编码。

(一)西文字符的编码

计算机中的信息都是用二进制编码表示的,用以表示字符的二进制编码称为字符编码。

计算机中最常用的字符编码是ASCII$2American Standard Code for Information Interchange,美国标准信息交换码$3,被国际标准化组织指定为国际标准。ASCII码有7位码和8位码两种版本。国际通用的是7位ASCII码,用7位二进制数表示一个字符的编码,共有27=128个不同的编码值,相应可以表示128个不同字符的编码,如表2所示。

表2  7位ASCII代码表

表2中对大小写英文字母、阿拉伯数字、标点符号及控制符等特殊符号规定了编码,表中每个字符都对应一个数值,称为该字符的ASCII码值。其排列次序为b6b5b4b3b2b1b0,b6为最高位,b0为最低位。

从ASCII码表中看出:有34个非图形字符$2又称为控制字符$3。例如:

SP $2Space$3编码是$20100000$3B           空格

CR $2Carriage Return$3编码是$20001101$3B     回车

DEL $2Delete$3编码是$21111111$3B           删除

BS $2Back Space$3编码是$20001000$3B        退格

其余94个可打印字符,也称为图形字符。在这些字符中,从0~9、从A~Z、从a~z都是顺序排列的,且小写比大写字母的码值大32,即位值b5为0或1,这有利于大、小写字母之间的编码转换。有些特殊的字符编码是容易记忆的。如:

“a”字符的编码为$21100001$3B,对应的十进制数是97;则“b”的编码值是$298$3D。

“A”字符的编码为$21000001$3B,对应的十进制数是65;则“B”的编码值是$266$3D。

“0”数字字符的编码为$20110000$3B,对应的十进制数是48;则“1”的编码值是$249$3D。

计算机的内部用一个字节(8二进制位)存放一个7位ASCII码,最高位置为0。

(二)汉字的编码

ASCII码只对英文字母、数字和标点符号作了编码。为了使计算机能够处理、显示、打印、交换汉字字符等,同样也需要对汉字进行编码。我国于1980年发布了国家汉字编码标准GB2312-80,全称是《信息交换用汉字编码字符集——基本集》(简称GB码)。根据统计,把最常用的6763个汉字分成两级:一级汉字有3755个,按汉语拼音排列;二级汉字有3008个,按偏旁部首排列。由于一个字节只能表示256种编码,所以一个国标码必须用两个字节来表示。为避开ASCII表中的控制码,只选取了94个编码位置,所以代码表分94个区和94个位。由区号和位号(区中的位置)构成了区位码。区位码最多可以表示94×94=8836个汉字。区位码由4位十进制数字组成,前两位为区号,后两位为位号。在区位码中,01~09区为特殊字符,10~55区为一级汉字,56~87区为二级汉字。例如汉字“中”的区位码为5448,它位于第54行,第48列。

为了与ASCII码兼容,汉字输入区位码和国标码之间有一个转换关系。具体方法是:将一个汉字的十进制区号和十进制位号分别转换成十六进制:然后再分别加上20H$2十进制就是32,因是非图形字符码值$3,就成为汉字的国标码。例如:

汉字中

区位码$25448$3D  $23630$3H= $200110110  00110000$3B还有

国标码$25650$3H  $23630H+2020H$3 = $201010110  01010000$3B

=$28680$3D$25448区位分别加32$3

世界上使用汉字的地区除了中国内地,中国台湾及港澳地区、日本和韩国,这些地区和国家使用了与中国内地不同的汉字字符集。中国台湾、香港等地区使用的汉字是繁体字即BIG5码。

1992年通过的国际标准ISO 10646,定义了一个用于世界范围各种文字及各种语言的书面形式图形字符集,基本上收全了上面国家和地区使用的汉字。前面所述的Unicode编码标准,对汉字集的处理与ISO 10646相似。

GB 2312-80中因有许多汉字没有包括在内,为此有了GBK编码(扩展汉字编码),它是对GB 2312-80的扩展,共收录了21003个汉字,支持国际标准ISO 10646中的全部中日韩汉字,也包含了BIG5(台港澳)编码中的所有汉字。GBK编码于1995年12月发布。目前Windows 95以上的版本都支持GBK编码,只要计算机安装了多语言支持功能,几乎不需要任何操作就可以在不同的汉字系统之间自由变换。“微软拼音”、“全拼”、“紫光”等几种输入法都支持GBK字符集。2001年我国发布了GB 18030编码标准,它是GBK的升级,GB 18030编码空间约为160万码位,目前已经纳入编码的汉字约为2.6万个。

(三)汉字的处理过程

从汉字编码的角度看,计算机对汉字信息的处理过程实际上是各种汉字编码间的转换过程。这些编码主要包括:汉字输入码、汉字内码、汉字地址码、汉字字形码等。这一系列的汉字编码及转换、汉字信息处理中的各编码及流程(图2)。

图2 汉字信息处理系统的模型

从图2中可以看到:通过键盘对每个汉字输入规定的代码,即汉字的输入码。不论哪一种汉字输入方法,计算机都将每个汉字的汉字输入码转换为相应的国际码,然后再转换为机内码,就可以在计算机内存储和处理了。输出汉字时,先将汉字的机内码通过简单的对应关系转换为相应的汉字地址码,然后通过汉字地址码对汉字库进行访问,从字库中提取汉字的字型码,最后根据字型数据显示和打印出汉字。

1.汉字输入码 为将汉字输入计算机而编制的代码称为汉字输入码,也叫外码。是利用计算机标准键盘上按键的不同排列组合来对汉字的输入进行编码。目前汉字输入编码法的研究发展迅速,己有几百种汉字输入编码法。一个好的输入编码应是:编码短,可以减少击键的次数:重码少,可以实现盲打;好学好记,可以便于学习和掌握。但目前还没有一种全部符合上述要求的汉字输入编码方法。目前常用的输入法大致有:音码、形码、语音、手写输入或扫描输入等。实际上,区位码也是一种输入法,其最大优点是一字一码的无重码输入法,最大的缺点是难以记忆。

可以想象,对于同一个汉字,不同的输入法有不同的输入码。例如:“中”字的全拼输入码是“zhong”,其双拼输入码是“vs”,而五笔形的输入码是“险”。这种不同的输入码通过输入字典转换统一到标准的国标码之下。

2.汉字内码 汉字内码是为在计算机内部对汉字进行存储、处理的汉字代码,它应能满足存储、处理和传输的要求。当一个汉字输入计算机后转换为内码,然后才能在机器内传输、处理。汉字内码的形式也有多种多样。目前,对应于国标码,一个汉字的内码用2个字节存储,并把每个字节的最高二进制位置“1”作为汉字内码的标识,以免与单字节的ASCII码产生歧义。如果用十六进制来表述,就是把汉字国标码的每个字节上加一个80H(即二进制数10000000)。所以,汉字的国标码与其内码有下列关系:

汉字的内码=汉字的国标码+$28080$3H

例如,在前面我们已知“中”字的国标码为$25650$3H,则根据上述公式得:

“中”字的内码=“中”字的国标码$25650$3H+$28080$3H=$2D6D0$3H

由此我们看出:英文字符的机内编码是7位ASCII码,一个字节的最高位为0。每个西文字符的ASCII码值均小于128。为了与ASCII码兼容,汉字用两个字节来存储,区位码再分别加上$220$3H,就成为汉字的国标码。在计算机内部为了能够区分是汉字还是ASCII码,将国标码每个字节的最高位由0变为1(也就是说机内码的每个字节都大于128),变换后的国标码称为汉字的内码。

(四)汉字地址码

汉字地址码是指汉字库(这里主要指整字形的点阵式字模库)中存储汉字字形信息的逻辑地址码。需要向输出设备输出汉字时,必须通过地址码。汉字库中,字形信息都是按一定顺序(大多数按标准汉字交换码中汉字的排列顺序)连续存放在存储介质上,所以汉字地址码也大多是连续有序的,而且与汉字内码间有着简单的对应关系,以简化汉字内码到汉字地址码的转换。

(五)汉字字形码

经过计算机处理的汉字信息,如果要显示或打印出来阅读,则必须将汉字内码转换成人们可读的方块汉字。汉字字形码又称汉字字模,用于汉字在显示屏或打印机输出。汉字字形码通常有两种表示方式:点阵和矢量表示方式。

用点阵表示字形时,汉字字形码指的就是这个汉字字形点阵的代码。根据输出汉字的要求不同,点阵的多少也不同。简易型汉字为16×16点阵,普通型汉字为24×24点阵,提高型汉字为32×32点阵、48×48点阵,等等。图3显示了“次”字的16×16字形点阵和代码。

图3 汉字字形点阵机器编码示例

在一个16×16的网格中用点描出一个汉字,如“次”字,整个网格分为16行16列,每个小格用1位二进制编码表示,有点的用“1”表示,没有点的用“0”表示,这样,从上到下,每一行需要16个二进制位,占两个字节。如第一行的点阵编码是0080H,描述整个汉字的字形需要32个字节的存储空间。汉字的点阵字形编码仅用于构造汉字的字库,一般对应不同的字体$2如宋体、楷体、黑体$3,有不同的字库,字库中存储了每个汉字的点阵代码。字模点阵只能用来构成“字库”,而不能用于机内存储。输出汉字时,先根据汉字内码从字库中提取汉字的字形数据,然后根据字形数据显示和打印出汉字。

点阵规模愈大,字形愈清晰美观,所占存储空间也愈大。两级汉字大约占用256KB。缺点是字形放大后产生的效果差。

矢量表示方式存储的是描述汉字字形的轮廓特征,当要输出汉字时,通过计算机的计算,由汉字字形描述生成所需大小和形状的汉字点阵。矢量化字形描述与最终文字显示的大小、分辨率无关,因此可产生高质量的汉字输出。Windows中使用的TrueType技术就是汉字的矢量表示方式,解决了汉字点阵字形放大后出现锯齿现象的问题。

(六)各种汉字代码之间的关系

汉字的输入、处理和输出的过程,实际上是汉字的各种代码之间的转换过程。图4表示了这些代码在汉字信息处理系统中的位置及它们之间的关系。

图4 汉字代码关系图

(七)其他汉字内码

GB 2312国标码只能表示和处理6763个汉字,为了统一地表示世界各国、各地区的文字,便于全球范围的信息交流,各级组织公布了各种汉字内码。

1.GBK码(扩充汉字内码规范) 我国制定的,对多达2万余的简、繁汉字进行了编码,是GB码的扩充。这种内码仍以2字节表示一个汉字,第一个字节为81H~FEH,第二个字节为40H~FEH。虽然第二个字节的最左边不一定是1,但因为汉字内码总是2字节连续出现的,所以即使与ASCII码混合在一起,计算机也能够加以正确区别。简体版中文Windows 95 / 98 / 2000 / XP使用的是GBK内码。

2.UCS码(通用多八位编码字符集) 国际标准化组织(ISO)为各种语言字符制定的编码标准。ISO / IEC 10646字符集中的每个字符用4个字节$2组号、平面号、行号和字位号$3唯一地表示,第一个平面(00组中的00平面)称为基本多文种平面(BMP),包含字母文字、音节文字以及中、日、韩(CJK)的表意文字等。

3.Unicode码 另一个国际编码标准,它最初是由Apple公司发起制定的通用多文字集,后来被Unicode协会开发为能表示几乎世界上所有书写语言的字符编码标准。采用双字节编码统一地表示世界上的主要文字,其字符集内容与UCS的BMP相同。目前,在网络、Windows系统和很多大型软件中得到应用。如英文版Windows使用的是8位ASCII码或Unicode-8,而中文版Windows使用的是支持汉字系统的Unicode-16等。

4.BIG5 目前中国台湾、香港地区普遍使用的一种繁体汉字的编码标准。繁体版中文Windows 95 / 98 / 2000 / XP使用的是BIG5内码。