• 内容讲解

非数值数据,通常指的是字符、字符串、图形符号、汉字等数据,它们并不用来表示数值的大小,一般情况下也不对它们进行算术运算。

1. ASCII字符

由于计算机内部只能识别和处理二进制代码,所以字符必须按照一定的规则用一组二进制编码来表示。

字符编码方式有很多种,美国国家标准局(ANSI)制定的ASCII(American Standard Code for Information Interchange,美国信息交换标准码)是现今最为通用的单字节编码系统,它主要用于显示现代英文字母和符号,已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。

ASCII字符编码表如表2-3所示,表中的横轴为7位ASCII码高3位b6b5b4的二进制表示,纵轴为ASCII码低4位b3b2b1b0的二进制表示,括号中的数字为对应的十六进制表示。

表2-3  ASCII字符编码表

217.gif

ASCII码用7位二进制编码(0~127)表示一个字符,总共可以表示128个字符,其中有95个是可显示和打印的字符,包括10个十进制数字(0~9)、52个英文大写和小写字母(A~Z,a~z)、以及若干个运算符和标点符号,除此之外的33个字符是不可显示和打印的控制符号,原先用于控制计算机外围设备的某些工作特性,现在多数已被废弃。

计算机通常用一个字节(8位)来存放一个ASCII字符,字节的低7位表示不同的ASCII字符,而字节的最高1位固定为0。在有些情况下,字节的最高1位也可以用作奇偶校验位以检验错误,或用作西文字符和汉字的区分标识。

除了使用字节最高位为0的标准ASCII码(0~127)之外,通过使用字节最高位为1的另外128个编码(128~255),许多公司和组织还自行定义了不少互不兼容的扩展ASCII码系统。扩展ASCII码用8位二进制表示一个字符,总共可以表示256个不同的字符。

2. Unicode

现今人类使用了接近6800种不同的语言,即使是扩展ASCII码这类8位代码也不能满足需要。解决问题的最佳方案是设计一种全新的编码方法,而这种方法必须有足够的能力来容纳全世界所有语言中任意一种语言的所有符号,这就是Unicode(统一码)。Unicode为每种语言中的每个字符设定了统一并且惟一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

目前实际应用的Unicode对应于UCS-2(2-byte Universal Character Set,2字节通用字符集),每个字符占用2个字节,使用16位的编码空间,理论上允许表示216=65536个字符,可以基本满足各种语言的使用需要。实际上目前版本的Unicode尚未填充满这16位编码,从而为特殊的应用和将来的扩展保留了大量的编码空间。这个编码空间已经非常大了,但设计者考虑到将来某一天它可能也会不够用,所以又定义了UCS-4编码,每个字符占用4个字节(实际上只用了31位,最高位必须为0),理论上可以表示231=2 147 483 648个字符。

在PC机中,若使用扩展ASCII码、Unicode UCS-2和UCS-4方法分别表示一个字符,则三者之间的差别为:扩展ASCII码用8位表示,Unicode UCS-2用16位表示,Unicode UCS-4用32位表示。

3. 字符串

字符串是指连续的一串字符,它们通常占用主存中连续的多个字节,每个字节存放一个字符(以ASCII字符为例)。当主存字由2个或4个字节组成时,在同一个主存字中,既可按从低位字节向高位字节的顺序存放字符串的内容,也可按从高位字节向低位字节的顺序存放字符串的内容。这两种存放方式都是常用方式,不同的计算机可以选用其中的任何一种。

例如下列字符串:

IF└┘A>=B└┘THEN└┘READ(C)

可以按图2-4所示从高位字节到低位字节依次存放在主存中。图中,主存单元长度是4个字节,每个字节中存放相应字符的ASCII值,文字表达式中的空格“└┘”在主存中也占一个字节的位置。因此,每个字节分别存放十六进制的49、46、20、41、3E、3D、42、20、54、48、45、4E、20、52、45、41、44、28、43、29。

218.gif