大学计算机基础(第三版)
上QQ阅读APP看书,第一时间看更新

1.2.5 计算机中数据的表示

信息是以数据的形式存储和处理的。数据的类型有很多,数字和文字是最简单的数据类型,表格、声音、图形和图像则是复杂的类型。计算机不能直接处理这些数据类型,必须把这些数据以规定的二进制形式表示才能被计算机加以处理,这些规定的形式就是数据的编码。编码时需要考虑数据的特性和是否便于计算机存储和处理。下面介绍几种常用的数据编码。

计算机的数据包括数值型和非数值型两大类。数值型数据可以进行算术运算,非数值型数据不能进行算术运算。

1.数值

(1)数的符号

由于数据有正有负,在计算机中用“0”表示“+”,用“1”表示“−”。一般把用正负符号数字化表示的数称为机器数,把正负符号用“+”和“−”表示的数称为真值。

(2)定点数和浮点数

在数学上,小数点一般用“.”来表示。在计算机中,小数点的表示采用人工约定的方法来实现,即约定小数点的位置,这样可以节省存储空间。

①数的定点表示:在定点数的表示方法中,小数点的位置是一个约定的假想位置。一般有两种定点方式:一是固定在符号位的后面(左面),通常用来表示一个规范化的小数,称为定点小数;二是将小数点固定在最低数值位的后面(右面),用来表示一个整数,称为定点整数。

定点整数分为带符号的整数和不带符号的整数两类。带符的整数的最高位表示符号,其他位是数值位。不带符号的整数全部都是数值位,不能表示负数。

表1-6中给出了8位、16位、32位字长的计算机所能表示的数的范围。

表1-6 位数不同的数的表示范围

提示

字长为n的有符号数可以表示的绝对值最大的负数为−2n,此时,数的最高位为1,它既表示符号位,也表示数值位。

例如,十进制数−100用一个字节存储形式如下:

其中,左侧的最高位“1”为数符,即符号位。

②数的浮点表示:用定点法所能表示的数值范围非常有限,在做定点运算时,计算结果很容易超出字的表示范围,所以当数据很大或很小时,通常用浮点数来表示。浮点表示法与科学计数法类似,十进制的指数表示一般形式是p=m×10n,p为十进制数值,m为尾数,n为指数,10为基数。

为了便于计算机中小数点的表示,规定将浮点数写成规格化的形式,即尾数绝对值的范围在[0.1,1)之间,这样便准确规定了小数点的位置,例如,0.000215的科学计数法的规格化形式为0.215×10-3

类似地,计算机中二进制数的浮点表示法主要包括两部分:一部分是尾数,为定点小数;另一部分是阶码,为定点整数,基数约定为2。阶码部分又包括阶符和阶码,尾数部分包括数符和尾数。其中,数符和阶符各占1位,阶码的位数对应数的大小范围,尾数的位数对应数的精度,存储形式如下:

假定1个浮点数用2个字节来表示,设阶码部分占4位,尾数部分占10位。十进制数−6.75在计算机内的表示形式作如下转换:

在计算机内的表示形式如下:

浮点数的运算精度和表示范围都远远大于定点数,但在运算规则上,定点数比浮点数简单,容易实现。因此,计算机中一般都同时具有这两种表示方法。

(3)原码、反码和补码

一个二进制数同时包含符号和数值两部分,将符号也数值化的数据称为机器数。在计算机中机器数的表示方法很多,常用的有原码、反码和补码3种形式。原码表示法简单易懂,但由于原码表示的数在运算时常要进行一些判断,从而增加了运算的复杂性,故引入反码和补码。

①原码表示法:原码表示法是一种简单的机器数表示法,即用最高位表示符号,其余位表示数值。设x为真值,[x]为数的原码。

②反码表示法:正数的反码与原码相同;负数的反码只须在原码的基础上把符号位以外各位按位“求反”(0变1,1变0)即可,[x]表示数的反码。

③补码表示法:正数的补码与原码相同;负数的补码是在原码的基础上符号位不变,数值各位取反(0变1,1变0),然后最低位加1,[x]表示数的反码。

从上面关于原码、反码、补码的定义可知:一个正数的原码、反码、补码的表示形式相同,符号位为0,数值位是真值本身;一个负数的原码、反码、补码的符号位都为1,数值位原码是真值本身,反码是各位取反,补码是各位取反后,最低位再加1。真值0的原码和反码表示不唯一,而补码表示是唯一的。

【例1-7】已知x1=+1100110,x2=−1100111,求x1和x2的原码、反码和补码。

解:根据原码和反码、补码的转换规则,可知正数的原码和反码、补码一致。即

[x1]=[x1]=[x1]=01100110

根据负数的转换规则,[x2]=11100111,[x2]=10011000,[x2]=10011001。

2.十进制数的编码——BCD码

人们习惯用十进制来计数,而计算机中采用的是二进制数。通常,计算机中用4位二进制数来表示一位十进制数,称为BCD码。常见的BCD码有8421 BCD码2421 BCD码。在8421 BCD码中,每4位二进制数为一组,组内每个位置上的位权从左至右分别为8、4、2、1。以十进制数0~15为例,它们的8421 BCD编码对应关系如表1-7所示。

表1-7 十进制数与BCD码的关系

提示

一个十进制数的BCD码与它对应的二进制数是有区别的。例如,十进制数16的BCD码是00010110,但它对应的二进制数是10000。

3.字符的编码

在使用计算机进行信息处理时,字符型数据是非常普遍的。字符型数据包括各种字母、数字与符号等,它们在计算机中用二进制进行统一编码。ASCII码(American Standard Code for Information Interchange)即美国标准信息交换码,被国际标准化组织(ISO)定为国际标准。

ASCII码有7位ASCII码和8位ASCII码两种。

7位ASCII码称为基本ASCII码,是国际通用的ASCII码。用1个字节表示7位ASCII码时,最高位为0,故7位二进制数可表示128个字符,它的范围为00000000B~01111111B。其中,包括52个英文字母(大、小写各26个)、0~9这10个数字及一些常用符号,如表1-8所示。

表1-8 ASCII码表

8位ASCII码称为扩充ASCII码,是8位二进制字符编码,其最高位有些为0,有些为1,其范围为00000000B~11111111B,因此可以表示256种不同的字符。其中,00000000B~01111111B为基本部分,对应十进制数的范围为0~127,共计128种;10000000B~11111111B为扩充部分,范围为128~255,也有128种。尽管对扩充部分的ASCII码美国国家标准信息学会已给出定义,但在实际应用中多数国家都将ASCII码扩充部分规定为自己国家语言的字符代码,如中国把扩充ASCII码作为汉字的机内码。

关于ASCII码有以下几点说明:

①通常一个ASCII字符占用1个字节(8bit),最高位为“0”,需要时最高位可用作奇偶检验位。

②标准的7位ASCII码字符分为两类:一类是可显示的打印字符,共有95个;另一类是不可显示的控制符,通常是计算机系统专用的,共有33个(前32个码和最后一个码)。

③ASCII码字符根据它们在表中的位置都有一个序号,数字字符0~9的ASCII码是连续的,为30H~39H;ASCII码字符是区分大小写的,大写字母A~Z和小写英文字母a~z的ASCII码也是连续的,分别为41H~5AH和61H~7AH。例如:大写字母A,其ASCII码为1000001B,即ASC(A)=65;小写字母a,其ASCII码为1100001B,即ASC(a)=97。可推得ASC(C)=67,ASC(c)=99。

4.汉字的编码

英文字母数量少,在计算机的键盘上都有对应的输入按键。计算机内部存储和处理英文字母一般采用ASCII码就可以完成。汉字数量庞大,而且汉字字形、字体复杂多变,使用计算机对汉字进行处理就要复杂得多。汉字的输入要采用输入码;在计算机中存放和处理要使用机内码;输出时需要用对应的字形码进行显示和打印。即在汉字处理中需要经过汉字输入码、汉字机内码、汉字字形码的三码转换,下面分别介绍与汉字相关的码型。

(1)汉字输入码

汉字的非键盘输入已取得了一定的发展,如语音识别输入、手写输入和扫描输入等。

汉字是一种拼音、象形和会意文字,本身具有十分丰富的音、形、义等内涵。经过专家多年的潜心研究,形成了种类繁多的汉字输入码。迄今为止,已有好几百种汉字输入码的编码方案问世,其中已经得到广泛使用的也达几十种之多。按照汉字输入的编码元素取材的不同,可将众多的汉字输入码分为如下4类:

①区位输入法:区位输入法是利用区位码进行汉字输入的一种方法,又称内码输入法。汉字区位编码由4位组成,前2位是区号,后2位是位号。区位码汉字输入法中的汉字编码无重码,向内部码转换方便。在熟练掌握汉字的区位码后,录入汉字的速度会很快,但若想记住全部区位码相当困难,所以区位码常用于录入特殊符号,如制表符、希腊字母等,或者输入发音、字形不规则的汉字、生僻字。

②音码:音码是根据汉字的发音来确定汉字的编码,其特点是简单易学,但重码太多,输入速度较慢。常用的音码输入法有全拼、智能ABC、双拼。

③形码:形码是根据汉字的字形结构来确定汉字的编码,其特点是重码较少,输入速度较快,但熟练掌握较困难,记忆量较大。目前,最为流行的形码输入法——五笔字型输入法是我国的王永明教授在1983年开发的,五笔字型输入法在世界上首破汉字输入每分钟100字大关,已成为在国内外占主导地位的汉字输入技术,这一重大技术发明为我国的科技进步和汉字在信息化、国际化时代的发展做出了重大贡献。

④音形码:音形码是既根据汉字的发音也根据汉字的形状来确定汉字编码的一种方法,其特点是编码规则简单,重码少,缺点是难记忆,例如自然码。

(2)国标码

我国的《信息交换用汉字编码字符集 基本集》GB 2312—1980中规定了信息交换所用的6763个汉字和682个非汉字图形符号的代码,即共有7445个代码。如此庞大的汉字集需要多少位二进制数才能够表示呢?由于汉字要区别于西文符号的表示,所以每个字节表示中最高位必须为1,故只能用低7位表示汉字集,即只能表示27=128个汉字。又由于低7位中有34种编码是用于控制字符,因此只有94(128−34=94)种状态可用于汉字编码。这样,双字节的低7位只能表示94×94=8836种状态。此标准的汉字编码表有94行、94列。其行号称为区号,列号称为位号。双字节中,用高字节表示区号,低字节表示位号。非汉字图形符号位于第1~11区,国标汉字集中的6763个汉字又按其使用频度、组词能力以及用途等因素分成一级常用汉字3755个,按音序排列;二级常用汉字3008个,按部首排列。一级汉字3755个置于第16~55区,二级汉字3008个置于第56~87区。例如,“大”字位于20区83位,其区位码如下:

国家标准GB 2312—1980中的汉字代码除了十进制形式的区位码外,还有一种十六进制形式的编码,称为国标码。国标码是在不同汉字信息系统间进行汉字交换时所使用的编码。为了与ASCII码兼容,每个字节值应大于32,因为0~32为非图形字符码值。所以,国标码是在十进制区位码的基础上,其区码和位码分别加十进制数32。例如,“大”字的国标码如下:

(3)汉字机内码

汉字的机内码是供计算机系统内部进行存储、加工处理、传输统一使用的代码,又称为汉字内部码或汉字内码。西文的机内码就是它的ASCII码,字符的ASCII码最高位为“0”,因此为了与西文字符区别,所有汉字的机内码在国标码的基础上,把两个字节的最高位一律由“0”改为“1”,就得到了汉字的机内码,如“大”字的机内码如下:

在Office办公软件中选择“插入”|“符号”命令,打开“符号”对话框,找到“大”字,可以看到“大”字的机内码对应的十六进制为B4F3H,如图1-13所示。

图1-13 “大”字的机内码输入

机内码表示简单,解决了中西文机内码存在二义性的问题。内码的形式也有多种,除GB 内码外,还有如GB K、UCS、BIG5、Unicode等。其中,Unicode码又称万国码或统一码,也是一个国际编码标准,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode码在当前的网络、Windows系统和许多大型软件中得到了广泛的应用。

(4)汉字的字形码

汉字字形码是汉字字库中存储的汉字字形的数字化信息,用于汉字的显示和打印。常用的输出设备是显示器与打印机。汉字字形码通常用点阵、矢量函数等方式表示。常用的字形点阵有16×16点阵、24×24点阵、48×48点阵、96×96点阵、128×128点阵、256×256点阵。不同的字体有不同的字库,如黑体、仿宋体、楷体等。点阵的点数越多,一个字的表达质量也越高,也就越美观,但占用的存储空间也就越大。以“大”的16×16点阵为例[见图1-14(a)],每行需用2个字节,共16行,则占用32个字节。因此,字模点阵只能用来构成“字库”,而不能用于机内存储。字库中存储了每个汉字的点阵代码,当显示输出时才检索字库,输出字模点阵得到字形。

提示

汉字“大”的16×16点阵的第一行在计算机中的十六进制代码存储内容的计算方法是:将第一行的两个字节中黑点处的D9和D8位置为1,其他位置为0,可得0000 0011 0000 0000B,即为0300H。其余各行的存储代码可同样推理。

(5)汉字处理流程

通过输入设备将汉字外码送入计算机,再由汉字系统将其转换成内码存储、传送和处理,当需要输出时,再由汉字系统调用字库中汉字的字形码得到结果,整个过程如图1-14(b)所示。

图1-14 “大”字点阵和汉字处理流程