从前一节的学习中我们已经了解了有关计算机和信息的一些基础知识和计算机应用方面的一些内容。为了更好地使用计算机,还必须了解计算机的数制、数据编码以及计算机系统的组成、工作原理等方面的基础知识。本节主要介绍数据与信息、二进制、数值以及非数值数据的编码方法。
数据与信息是两个经常使用的概念,我们在前面已经做过简单介绍,在信息技术领域中,它们有着特定的内涵,下面分别加以讨论。
在通常情况下,数据是指那些确定的、可以比较大小的数值。但在信息技术领域中,数据一词所包括的内涵更广泛。
通常,数据是指记录在某种媒体上的可以识别的物理符号。国际标准化组织(ISO)据给出的数据定义是:“数据是对事实、概念或指令的一种特殊表达形式,这种特殊的表达形式可以用人工的方式或者用自动化的装置进行通信、翻译转换或者进行加工处理。”
对于数据这个概念,我们可以这样来理解:首先,数据是“事实、概念、指令”等具体内容的某种表述,数据不仅包括数字、字母、文字、符号,而且包括声音、图形、图像、动画、影像等;其次,这些数据可以通过人工或自动化的方法进行通信、翻译、处理。
在计算机中,各种形式的数据以一种“特殊的表达形式”——二进制编码形式来表示。人们以各种存储设备来存储数据,通过各种软件来管理数据,使用各种应用程序来对数据进行加工处理。
在信息技术领域中,数据通常分为数值数据和非数值数据两大类。数值型数据是指人们日常生活中具有大小和多少的数据,对于数值数据可以进行加、减、乘、除以及比较等数学运算。非数值型数据是指除了数值数据以外的其他数据,它通常包括字符数据、逻辑数据以及多媒体数据。字符数据是指由字母、符号等组成的数据,它可以方便地表示文字信息,供人们阅读和理解,对字符数据进行的处理方式包括比较、转换、检索、排序等。逻辑数据用来表达事物内部的逻辑关系,对逻辑数据可以进行“与”、“或”、“非”以及比较等运算操作。声音、图形、图像、动画、视频影像数据通常归入到多媒体数据范畴,关于多媒体数据将在多媒体技术一章进行详细介绍。
“信息”是目前广泛使用的一个高频词。关于信息的定义自信息论诞生以来就没有明确过,几十年来信息的定义已有上百个之多。即使这样也没能有一个统一、科学、合理、公认的全方位定义。
《辞海》(1999年版)中对信息的解释为:“通信系统中传输和处理的对象,泛指消息和信号的具体内容和意义”。这个解释说明了在“信息处理”一词中的信息的内涵。
而《简明不列颠百科全书》(1991年版)中称:“信息论中的‘信息’与信号中固有的意义无关”,从信息系统的角度来说,信息是“信宿”(接受信息的客体)对“信源”(发出信息的主体)的“感知”。
也有学者认为,信息就是“一切可以被传递、被感知的新闻、知识、消息、情报、报道、事情、数据、材料、现象、事物、主题、内容的统称”。
“信息就是信息,不是物质,也不是能量”则从信息是客观世界的一种本质属性的角度,说明了信息同物质、能源一样重要,是人类生存和社会发展的三大基本资源之一。
总之,由于所属领域不同、研究角度不同,对信息也存在多种不同的解释。一般来说,信息既是对各种客观存在的事物的变化和特征的反映,又是各个事物之间作用和联系的表征。人类就是通过接受信息来认识事物的,信息是对人们有用的消息,是接受者原来不了解的知识。
数据与信息是两个相互联系但完全不同的概念。信息是客观存在的,必须是真实的、有意义的,必须对接受者有用。而数据则只是一种表述,也可能是无用的、无意义的,甚至可以编造出虚假的数据。
在信息技术领域中,数据通常作为信息的载体,用来表示信息。所谓“数据处理”是指将数据经过处理转换从中提取有用数据(信息)的过程,所以有时也称为“信息处理”。对计算机系统而言,实际上只存在数据,而信息只是对使用系统的人而存在。
在许多场合,如果不引起混淆,信息和数据便往往不加严格区分。例如:通常所谓的“管理信息系统”、“地理信息系统”,实质上属于数据密集型的计算机应用系统,其目的是通过数据的转换处理得到与使用目的相关的信息。
目前广泛流行的各种信息相关名词,如信息技术、信息产业、信息社会等,根据不同的用法和场合,其中的信息含义是不同的。信息技术是如何使各种客体的变化特征,被人类所广泛感知,并成为人类的知识构成这么一些技术手段,这里的信息主要是指客观信息。信息产业则是使信息技术成为有利可图的商业行为和一定规模的社会结构。信息社会使人类获取、利用信息的能力达到空前水平,并成为人类日常生活中的重要活动之一。这里的信息主要是指主观信息。
研究数据的概念和内涵,有助于理解计算机数据处理的方法和特点;有助于掌握计算机的基本概念和基本操作。讨论信息的本质特征及科学界定信息的定义,有助于理解信息与物质、能量并列构成系统的三要素这个新概念;有助于确立信息在认识论中的地位。
计算机处理各种数据,首先要将它们表示成具体的数据形式。选择什么样的数制来表示数,对机器的结构、性能、效率有很大的影响。二进制是计算机中数制的基础。为什么要采用二进制形式呢?因为二进制最简单,它仅有两个数字符号,特别适合计算机的“数字逻辑电路”,也就是说,计算机的硬件结构决定了二进制是其数制基础。其次,二进制数的运算规则简单。另外,计算机的理论基础是数理逻辑,数理逻辑中的“真”和“假”可以分别用“1”和“0”来表示,并将逻辑处理和算术处理相互联系起来。
关于数的记写和命名的相关规则的集合称为计数制,简称数制。目前通常采用进位计数制,如十进制计数,逢十进一;每周有七天,逢七进一;而计算机中存放的是二进制数,逢二进一。为了书写和表示方便,还引入了八进制计数和十六进制计数。
与数制相关的概念有以下四个。
(1)数码(简称码):该数制记写时所用的符号,如十进制的0,1,2,…,9。
(2)基数(简称基):该数制所用数码的个数,如十进制的基为10。
(3)数位(简称位):数码在数中所占据的位置,如十进制中的个位、十位等。
(4)位权(简称权):由数位所决定的计数基本值,如十进制个位的权为100。
在采用进位记数的数字系统中,如果某个数制的基为r,则称其为基r进制(r进制)。
假定数值S用m+n+1个自左向右排列的代码Ki(m≤i≤n)表示,即:
S=KnKn-1…K1K0 . K-1K-2…K-m
其中,Kj就是数码,而i=n,n-1,…,1,0,-1,…,-m则表示各个数位,其位权为ri。
计算机中常用的各种数制的表示如表1-2所示。
表1-2 几种常用的计数制
进位计数制 |
二 进 制 |
八 进 制 |
十 进 制 |
十六进制 |
进位规则 |
逢二进一 |
逢八进一 |
逢十进一 |
逢十六进一 |
数码 |
0 , 1 |
0,1,2,3,4,5,6,7 |
0,1,2,…,9 |
0,…,9,A,…,F |
基数 |
r = 2 |
r = 8 |
r = 10 |
r = 16 |
位权 |
2i |
8i |
10i |
16i |
形式表示字母 |
B |
O或Q |
D |
H |
由上表可知,各种数制所采用的数码是不同的,而其权值是其基数r的某次幂。因此,对于任何一种进位制计数法所表示的数S都可以书写为按照其位权展开的多项式之和的形式:
S = kn-1′rn-1+kn-2′rn-2+…+k1′r1+k0′r0+k-1′r-1+…+k-m′r-m
对于二进制、八进制和十六进制数,在书写时为了防止与十进制数混淆,常采用如下的方法:
(1)二进制数:101011.01B 或(101011.01)2。
(2)八进制数:543.21Q或543.21O或(543.21)8。
(3)十六进制数:9AB.2CH或(9AB.2C)16。
(4)十进制数则采用平常的书写方式。
(1)r进制数转换为十进制数。
数的按位权展开式:
本身就提供了将r进制数转换为十进制数的方法。所以,只要将各个数位的数码乘以各自的位权,然后把各个值累加起来就是该数的十进制值。
例如:
(101011.01)2 = 1′25+0′24+1′23+0′22+1′21+1′20+0′2-1+1′2-2
=43.25
(543.21)8 = 5′82+4′81+3′80+2′8-1+1′8-2
=355.140625
(9AB.2C)16 = 9′162+10′161+11′160+2′16-1+12′16-2
=2475.171875
(2)十进制数转换为r进制数。
将十进制数转换成r进制数时,首先要将此十进制数分为整数与小数两部分,然后进行不同的操作。
对该数的整数部分连续整除r取余,直到整除所得的商为零,把所得的各个余数按照相反顺序排列起来,就是r进制数的整数部分。
对该数的小数部分连续乘以r取整,直到乘后积的小数部分为零或达到所需要的精度,将取出的各个整数按照原来顺序排列起来,就是r进制数的小数部分。
例如:将123.45转换为二进制数。
首先将该数分为123和0.45两部分,然后分别进行如下操作。
所以,123.45=(1111011.0111)2。
又例如:将123.45转换为十六进制数。
所以,123.45=(7B.73)16。
(3)二进制数、八进制数和十六进制数之间的相互转换。
在计算机内部,所有的信息都是由二进制表示的。但二进制信息占据的位数较多,书写起来比较长,并且容易出错,所以通常借助于八进制或十六进制来表示二进制信息。由于23=81、24=161,所以,1位八进制数相当于3位二进制数,1位十六进制数相当于4位二进制数。另外,在进行十进制数和二进制数的相互转换时,也可将八进制或十六进制作为中间过渡,从而简化转换的运算操作。
八进制数及十六进制数与二进制数之间的对应关系如表1-3所示。
表1-3 八进制、十六进制与二进制的对应关系
八进制数 |
对应二进制 |
十六进制数 |
对应二进制 |
十六进制数 |
对应二进制 |
0 |
000 |
0 |
0000 |
8 |
1000 |
1 |
001 |
1 |
0001 |
9 |
1001 |
2 |
010 |
2 |
0010 |
A |
1010 |
3 |
011 |
3 |
0011 |
B |
1011 |
4 |
100 |
4 |
0100 |
C |
1100 |
5 |
101 |
5 |
0101 |
D |
1101 |
6 |
110 |
6 |
0110 |
E |
1110 |
7 |
111 |
7 |
0111 |
F |
1111 |
在将二进制数转换为八进制数时,对二进制数以小数点为中心向左右两边分组,每组为3位二进制,两头不足3位的用0补充,然后每组3位二进制用1位八进制代替。而二进制转换为十六进制时,只要每4位二进制分为一组即可。
如:011101 010 . 110 111 B = 352.67 Q
3 5 2 6 7
01001100 0110 . 1110 0001 B = 4C6.E1 H
4 C 6 E 1
同样,将八进制或十六进制数转换为二进制数时,只要将每个八进制数替换为3位二进制数,每个十六进制数替换为4位二进制数即可。
如:352.67 Q = 011 101 010 . 110 111 B = 11101010.110111B
3 5 2 6 7
4C6.E1 H = 0100 1100 0110 . 1110 0001 B = 10011000110.11100001B
4 C 6 E 1
123.45 = 7B.7 H = 0111 1011 . 0111 B = 1111011.0111B
转换后整数前的高位0和小数后的低位0应去除。
(1)二进制数的算术运算。
二进制数的算术运算也包括加、减、乘和除,但是二进制算术运算的规则更简单。通常,在计算机内部,二进制加法是基本运算,减法是通过加上一个负数(补码运算)来实现的,而乘法和除法则通过移位操作和加减运算来实现。通过采取这样的措施,计算机的运算器的结构可以更简单、运行可以更稳定。
· 加法
二进制加法的基本规则为:
0 0 1 1
+0 +1 +0 +1
0 1 1 10(进位)
例如:二进制数10110B+10011B的计算式子为:
1 0 1 1 0 22
+ 1 0 0 1 1 +19
1 0 1 0 0 1 41
在二进制加法的执行过程中,每一个二进制位上有3个数相加,即本位的被加数、本位的加数、来自低位的进位(有进位为1,否则为0)。
在计算机内部的运算器中,二进制数的加法是通过专门的逻辑电路——加法器来实现的,在运算器中还有保存运算结果和结果特征的装置。
· 减法
二进制减法的基本规则为:
0 0 1 1
-0 -1 -0 -1
0 1(借位) 1 0
例如:二进制数10110B-10011B的计算式子为:
1 0 1 1 0 22
-1 0 0 1 1 -19
1 1 3
同样,在二进制减法的执行过程中,每一个二进制位上有3个数参加操作,即本位的被减数、本位的减数、本位向高位的借位(有借位为1,否则为0)。
· 乘法
二进制乘法的基本规则为:
0 0 1 1
′0 ′1 ′0 ′1
0 0 0 1
例如:二进制数10110B′10011B的计算式子为:
1 0 1 1 0 22
′1 0 0 1 1 ′19
1 0 1 1 0 418
1 0 1 1 0
0 0 0 0 0
0 0 0 0 0
1 0 1 1 0
1 1 0 1 0 0 0 1 0
在二进制乘法的执行过程中,每一次相乘的部分积取决于乘数,或者为0(乘数为0时),或者为被乘数(乘数为1时),所以二进制数的乘法可以归结为被乘数的左移和相加操作。
· 除法
二进制除法的基本规则为:
0 0 1 1
?0 ?1 ?0 ?1
0 0 无意义 1
例如:二进制数111011B?1011B的计算式子为:
1 0 1 59?11=5……4
1 0 11 1 1 1 0 1 1
1 0 1 1
1 1 1 1
1 0 1 1
1 0 0
同样,二进制数的除法可以归结为除数的右移和对被减数的相减操作。
(2)二进制数的逻辑运算。
1847年英国数学家布尔(George Boole)创立了逻辑代数,提出了用符号来表达语言和思维逻辑的思想,到了20世纪,布尔的这种思想发展成为现代的逻辑代数(也称为布尔代数)。逻辑代数与普通代数一样有变量和变量的取值范围,也有演算公式和运算规则,同样也可定义函数及其基本性质。普通代数研究的是事物发展变化的数量关系,而逻辑代数研究的是事物发展变化的逻辑(因果)关系。
计算机不仅可以存储数值数据并进行算术运算,而且也可以存储逻辑数据并进行逻辑运算。在计算机中具有实现逻辑功能的电子电路,并利用逻辑代数规则进行各种逻辑判断,从而使计算机能够模拟人类智能的功能。
下面简单介绍一下逻辑数据的表示方法和逻辑代数的基本运算规则,为以后程序设计的学习打下基础。
· 逻辑数据的表示
逻辑数据用来表示真与假、是与非、对与错,这种具有逻辑性质的变量称为逻辑变量,逻辑变量之间的运算称为逻辑运算。在逻辑代数和计算机中,用“1”或“T”(True)来表示真、是、对等,用“0”或“F”(False)来表示假、非、错等。所以,逻辑运算是以二进制为基础的。
· 逻辑运算
逻辑运算用来反映事件的原因与事件的结果之间的逻辑关系。逻辑运算的结果为逻辑值。逻辑运算包括三种基本运算:逻辑与、逻辑或、逻辑非,由这三种基本运算可以组合、构造、推导出其他各种逻辑运算。
在逻辑运算中,常将参加逻辑运算的逻辑变量的、各种可能的取值组合以及对应的运算结果值列成表格,并称之为“真值表”,真值表是描述各种逻辑运算的常用工具。
· 逻辑与运算
逻辑与(And)也称为逻辑乘,通常用′、ù、×来表示。
逻辑与表示两个简单事件A与B构成逻辑相乘的复杂事件,并当A与B事件同时满足条件时整个复杂事件的结果才为真,否则结果就为假。
逻辑与的基本运算规则为:
0′1=0 1′0=0 0′0=0 1′1=1
逻辑与运算的真值表如表1-4所示。
表1-4 “与”运算的真值表
A |
B |
F=A′B |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
通常将逻辑与的运算规则归纳为:“有0为0,全1为1”。
例如:人事招聘广告中的“年龄40以下、学历大专以上”。
· 逻辑或运算
逻辑或(Or)也称为逻辑加,通常用+、ú来表示。
逻辑或表示两个简单事件A与B构成逻辑相加的复杂事件,并当A与B事件中有一个满足条件时整个复杂事件的结果就为真,否则结果就为假。
逻辑或的基本运算规则为:
0+1=1 1+0=1 0+0=0 1+1=1
逻辑或运算的真值表如表1-5所示。
表1-5 “或”运算的真值表
A |
B |
F=A+B |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
通常将逻辑或的运算规则归纳为:“全0为0,有1为1”。
例如:高考加分条件中的“省级优秀学生、奥林匹克竞赛二等奖以上”。
· 逻辑非运算
逻辑非(Not)也称为逻辑反,通常是在逻辑变量的上方加一条短横线,如。
逻辑非表示与简单事件A含义相反,即如果为真时使其为假、若为假时使其为真。
逻辑非的基本运算规则为:
0=1 1=0
逻辑非运算的真值表如表1-6所示。
表1-6 “非”运算的真值表
A |
F=A |
0 |
1 |
1 |
0 |
通常将逻辑与的运算规则归纳为:“非0为1,非1为0”。
例如:通常所谓的少数民族就是“民族不是汉族”。
(1)二进制数据的数据量的计量。
在计算机内部,各种数据都是以二进制编码的形式表示和存储的。二进制数据的数据量常采用位、字节、字等几种量纲。
· 位:(bit,缩写为b,俗称小b) 也常称为比特、字位、位元,指二进制数据的每一位(“0”或“1”),它是二进制数据量的最小计量单位。
· 字节:(Byte,缩写为B,俗称大B)是二进制数据量的基本计量单位,数据在计算机中也是以字节为单位存储的。一个字节由8个字位组成,它们从左到右排列为b7 b6 b5 b4 b3 b2 b1 b0。其中b7是最高位,b0是最低位。
· 字:(Word) 也常称为计算机字,它是可作为独立的数据单位进行处理的若干字位的组合。字所包含的字位的个数称为字长,字长一般是字节长度的整数倍,如16、32等。
计量二进制数据量的常用单位还有:
千字节(KB),1KB=210字节=1024B。
兆字节(MB),1MB=220字节=1024KB。
吉字节(GB),1GB=230字节=1024MB。
太字节(TB),1TB=240字节=1024GB。
(2)二进制数据的数据传输速率的计量。
在计算机内部或计算机与计算机之间进行数据传输时,如果是采用一个字节的8个二进制位同时传输的并行方式,则传输速率的计量单位为:字节/秒(bps)、千字节/秒(Kbps)、兆字节/秒(Mbps)等。
在计算机网络中,传输二进制数据通常采用逐个字位的串行传输方式,传输速率的计量单位为:
①比特/秒(bps),也常称为比特率、波特率、波特。
②千比特/秒(Kbps),1Kbps=210比特/秒=1024bps。
③兆比特/秒(Mbps),1Mbps=220比特/秒=1024Kbps。
所谓数值信息,就是指计算机中有正负和大小之分的、可以加减乘除的数值数据。计算机中的数值数据分为整数和实数两大类,它们的表示方法有很大的不同。
在计算机中,所有的数据、指令都是用特定的二进制代码来表示的。用特定的二进制代码来表示数据或指令的过程称为编码,编码所采用的各种规则的集合称为码制。本节介绍几种常用的数值数据的编码方法,非数值数据的编码方法将在下节介绍。
对于数值数据来说,我们把该数据本身称为真值,把该数据在计算机内的二进制形式称为机器数。
机器数具有下列特点:
(1)由于计算机设备本身的限制,机器数有固定的位数,因此它表示的数值的范围是有限制的。例如,用长度为16位二进制的机器数来表示没有符号的整数,则最小的0000 0000 0000 0000表示十进制数据0,最大的1111 1111 1111 1111表示十进制数据65535,所以其表示数据的范围为0~65535,若数据超过这个范围则无法正确表示。我们把这种超出范围无法表示的现象称为“溢出”。
(2)机器数把真值的符号数字化。通常用机器数的最高位表示真值的符号,“0”表示正、“1”表示负。例如,在用长度为16位二进制的机器数来表示有符号的整数时,1000 1011中最高位的1表示该数为负数,其余的000 1011表示其数值部分。
(3)真值的小数点在机器数中依靠格式上的事先约定来表示。如果小数点的位置在约定中是固定的,则称为定点数或定点表示。如果小数点的位置在约定中不是固定的(浮动的),则称为浮点数或浮点表示。
数值数据的机器数有不同的表示方法,目前比较常用的有4种:原码、反码、补码和移码。
· 原码
机器数最简单的表示方法是原码,原码表示的规则是:机器数的最高位表示符号,“0”表示正、“1”表示负;剩余各位为该数值的绝对值的二进制表示。通常,我们用[x]原来表示数值x的原码。
如在8位二进制机器数中:
[+95]原=0101 1111 [-95]原=1101 1111
[+118]原=0111 0110 [-118]原=1111 0110
因为[+0]原=0000 0000、[-0]原=1000 0000,所以数值0在原码中不是唯一的,有“正零”和“负零”之分。在8位长度的机器数中,原码的表示范围为+127~-127。
数值数据的原码表示简单易懂,与真值之间的转换也较方便,可用于乘除运算。在进行加减运算时,在参与运算的数值符号不同的情况下,必须用绝对值较大的数值的符号作为结果的符号,用绝对值较大的数值减去绝对值较小的数值,这样会增加计算时间或提高对计算机硬件的要求。
· 反码
反码表示的规则是:对于正数,其反码与原码相同;对于负数,其反码的符号位为1,数值位是其绝对值二进制的各位取反。通常,我们用[x]反来表示数值x的反码。反码表示用数学方式可定义为:
x 2n-1>x≥0
[x]反= (对于n位机器数)
2n+x-1 0>x>-2n-1
在反码中0也有两种表示形式,即[+0]反=0000 0000和[-0]反=1111 1111。
反码很少直接用于计算,主要被用来作为通过真值求补码。
· 补码
在讨论补码前,先简单介绍模的概念。
所谓“模”,是指一个计量系统的计量范围。如:时钟的模为12(计量范围为0~11),某个电度表的模为10000(计量范围为0~9999)。计算机的机器数也可以看成一个计量工具,它的模为2n,计量范围为0~2n-1,设n=8,则模为28=256,计量范围是0~255(0000 0000~1111 1111),若在255上再加1,则计数值又变为0,在最高位上溢出一个“1”。由此可见,由于溢出无法在计量器上表示出来,在计量器上只能表示出模的余数。
我们都知道,对于时钟来说,正拨8小时的结果和倒拨4小时的结果是相同的,或者说-4和+8对于12来说是互补的,也就是对于12来说-4的补码为12+(-4),即为+8。这样,只要把减数用相应的补码表示,就可以把减法运算转化为加法运算。
下面引入补码的表示方法。
通常,我们用[x]补来表示数值x的补码。
对于n位的机器数来说,数x的补码表示可定义为:
x 2n-1>x≥0
[x]补= (对于n位机器数)
2n+x 0>x≥-2n-1
即正数的补码就是它本身,负数的补码是真值与模数的和。
例如:当n=8时:
[+73]补=0100 1001
[-73]补=1 0000 0000 – 0100 1001=1011 0111
[-1]补=1 0000 0000 – 0000 0001=1111 1111
[-127]补=1 0000 0000 – 0111 1111=1000 0001
数0的补码表示是唯一的,[0]补=[+0]补=[-0]补=0000 0000。
求负数的补码,有一个简便的方法:符号位取1,其余各位按照其真值取反,然后在其末位加1。
例如:求-45的补码。
第一步:将-45表示为二进制数,得 – 010 1101。
第二步:符号位取1,其余各位取反,得1101 0010。
第三步:末位加1,得1101 0011。
所以,[-45]补=1010 1110。
求负数的补码的另一个简便的方法是:将该数的原码从右向左照抄到第一个1,其余各位取反,符号位不变。
例如:求-45的补码。
第一步:将-45表示为原码,为1010 1101。
第二步:将原码从右向左照抄到第一个1,其余各位取反,符号位不变,得到结果为1101 0011。
如果已知一个负数的补码,求其真值的方法为:若符号位为0,则符号位后的二进制为其真值,且该数为正;若符号位为1,则将符号位后的各个二进制逐位取反,再在末位加1(可以理解为求补码的补码),所得结果为真值,且为负。
例如:求[1101 0011]补的真值。
第一步:除符号位外,各位取反,得1010 1100。
第二步:末位加1,得1010 1101。
所以,其真值为(-010 1101)2,即(-45)10。
另外,根据补码的定义,可以证明:
[x]补+[y]补=[x+y]补
[x]补-[y]补=[x-y]补
这表明,补码相加的结果为补码,而且在运算时符号位同数值部分作为一个整体参与运算,如果符号位有进位,则舍去进位。
计算机中的数值数据采用补码表示后,加法和减法可以统一为加法运算,从而大大简化了计算机运算部件的逻辑电路设计。
· 移码
移码的定义是:
[x]移=2n-1+x 2n-1>x≥-2n-1
也就是说,无论x是正还是负,其移码都要加上2n-1。
例如:当n=8时,
[36]移=10100100
[-36]移=01011100
因此,移码的最高位与原码、反码和补码不同。当真值为正时,其最高位为1;当真值为负时,其最高位为0。从形式上看,移码和补码除了符号位相反外,其余各位相同。
移码在计算机中主要用来表示浮点数中的阶。
· BCD码
人们习惯于使用十进制数,为了使计算机能识别、存储十进制数,并能直接使用十进制数形式进行运算,就需要对十进制数进行编码,即用0和1的不同组合来表示十进制数的各个数位上的数字,进而表示一个十进制数。
将十进制数表示为二进制的编码形式,称为十进制数的二进制编码,简称二—十进制编码或BCD(Binary - Coded Decimal)码。
一位十进制数有0~9共10个数字字符,需要采用四位二进制数才能表示。然而四位二进制可以组合成16个不同的编码,原则上,可以从这16个编码中任意选取10个来使用,但在实际中只采用了少数几种方案。
通常采用的方案是在从四位二进制编码中选取由0000开始的前10个码分别表示数字0~9(如表1-7所示)。
表1-7 BCD代码表
十进制数 |
BCD码 |
十进制数 |
BCD码 |
0 |
0000 |
5 |
0101 |
1 |
0001 |
6 |
0110 |
续上表
十进制数 |
BCD码 |
十进制数 |
BCD码 |
2 |
0010 |
7 |
0111 |
3 |
0011 |
8 |
1000 |
4 |
0100 |
9 |
1001 |
这种BCD码是最简单、最自然的一种编码,它的代码本身的值就是其所代表的数字的值,它的四位二进制的权分别为23、22、21、20,即8、4、2、1,所以通常称为8421BCD码。
例如:十进制数123的8421BCD码为0001 0010 0011。
我们使用的十进制数都可以表示为一个纯小数与10的若干次幂的乘积。
例如:123=103′0.123=103′(1′10-1+2′10-2+3′10-3)
0.00123=10-2′0.123=10-2′(1×10-1+2′10-2+3′10-3)
-123=103′(-0.123)= 103′[-(1′10-1+2′10-2+3′10-3)]
也就是说,对于任何一个十进制数N,都可以表示成:
其中,r表示数N的小数点的位置,可以为正、负或零,m为数的有效数字部分(称为尾数)的位数,Ni为0~9。
将这个概念推广到二进制数中,就有:
其中,Ni为0或1。
前面曾经提到,数的小数点在计算机中是通过隐含规定其位置来表示的,根据小数点的位置是否固定而分为定点表示和浮点表示两种方法。在定点表示中,r为常数;在浮点表示中,r不是常数。
(1)定点表示法。
数值数据的定点表示法规定所有数据的小数点的位置隐含固定于某个位置,这样的数据被称为定点数。
通常,小数点固定在数值的最高位之前或最低位之后。
当小数点固定在数值的最高位之前时,机器数所表示的是一个纯小数,其绝对值最大为1-2-n,最小为2-n。当数据或计算结果小于2-n时产生“下溢”,当作零处理;当数据或计算结果大于1-2-n时产生“上溢”,这时需要进行溢出处理。
当小数点固定在数值的最高位之后时,机器数所表示的是一个纯整数,其绝对值最大为2n-1,最小为1。当然,当数据或计算结果超出可表示范围时也会发生“溢出”。
定点数的表示范围非常有限,因而容易产生溢出,但是表示方法简单,对硬件和软件的要求也较低,在一些要求不高的应用场合常常被使用。
(2)浮点表示法。
在浮点表示法中,数据的小数点的位置不是固定的。因此,小数点位置在数中必须显式给出。
由于任何一个二进制数N可以表示为:
其中,M为数的有效数字,称为尾数;±为尾数的符号,称为数符或尾符;r表示数的因子中基的幂次,称为阶或阶码,其符号称为阶符,它们表示小数点的位置。
这样,任何一个二进制浮点数都可由尾数、尾符和阶码、阶符这两个部分组成。通常,尾数为补码表示的二进制定点纯小数,小数点在其最高位的左边;阶为移码表示的二进制定点整数,小数点在其最低位右边,隐含的基数为2。
浮点数的表示格式有两种,如下所示。
尾符 |
阶符 |
阶码 |
尾数 |
阶符 |
阶码 |
尾符 |
尾数 |
在字长为n的浮点数中,阶符和尾符各占一位,阶为e位,则尾数是m=n-e-2位。
当阶符为正,阶码和尾数是可以表示的最大值时,浮点数的绝对值为最大。
当阶符为负,阶码为可表示的最大值,尾数为可表示的最小值时,浮点数的绝对值为最小。
例如,在16位浮点数中,阶符和尾符各占1位,如果阶码为5位,则尾数为9位,那么可以表示的最大数和最小数的绝对值分别为:
采用浮点方法表示数值数据时,同样的二进制位数可以比定点方法表示更大范围的数值。当然,如果数据超过这个表示范围,也会产生“溢出”。
浮点运算对计算机硬件的要求比定点运算高,运算规则相对也比较复杂,运算速度也比较慢。在目前的计算机中,定点方法和浮点方法都被采用,用户可以根据实际需要进行选择。
计算机中的信息除了表示数值信息的数值数据以外,还有大量的表示非数值信息的诸如文字、图形、图像、声音、动画视频数据。这些数据也必须采用二进制代码的形式才能在计算机中进行表示。本节主要介绍西文字符和中文字符在计算机中的表示方法,简单介绍计算机中处理汉字信息的基本过程,有关图形、图像、声音、动画视频在计算机中的表示的知识将在第4章介绍。
所谓西文,是指那些拉丁字母、数字、标点符号以及一些特殊符号,平时常将它们简称为字符(Character)。所有这些字符的集合称为“字符集”,在这个字符集中的每个字符都必须具有一个唯一的代码,所有字符集中字符的代码组成该字符集的代码表,简称为“码表”。
目前,计算机中西文信息采用的字符集以及相关的码表是ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)。
ASCII采用了七位二进制的编码方式,可以表示27=128个西文字符,如表1-8所示。
表1-8 ASCII码表
b6b5b4 b3b2b1b0 |
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
0000 |
NUL |
DLE |
SP |
0 |
@ |
P |
` |
p |
0001 |
SOH |
DC1 |
! |
1 |
A |
Q |
a |
q |
0010 |
STX |
DC2 |
” |
2 |
B |
R |
b |
r |
0011 |
ETX |
DC3 |
# |
3 |
C |
S |
c |
s |
0100 |
EOT |
DC4 |
$ |
4 |
D |
T |
d |
t |
0101 |
ENQ |
NAK |
% |
5 |
E |
U |
e |
u |
0110 |
ACK |
SYN |
& |
6 |
F |
V |
f |
v |
0111 |
BEL |
ETB |
, |
7 |
G |
W |
g |
w |
1000 |
BS |
CAN |
( |
8 |
H |
X |
h |
x |
1001 |
HT |
EM |
) |
9 |
I |
Y |
i |
y |
1010 |
LF |
SUB |
* |
: |
J |
Z |
j |
z |
1011 |
VT |
ESC |
+ |
; |
K |
[ |
k |
{ |
1100 |
FF |
FS |
. |
< |
L |
\ |
l |
| |
1101 |
CR |
GS |
- |
= |
M |
] |
m |
} |
1110 |
SO |
RS |
. |
> |
N |
^ |
n |
~ |
1111 |
SI |
US |
/ |
? |
O |
_ |
o |
DEL |
在ASCII码表中,前32个(编码为000 0000~001 1111)以及最后一个(编码为111 1111)是不可显示的控制字符,其中常用的控制字符的作用如下:
BS(Backspace) 退格 HT(Horizontal Table) 水平制表
LF(Line Feed) 换行 VT(Vertical Table) 垂直制表
FF(Form Feed) 换页 CR(Carriage Return) 回车
CAN(Cancel) 作废 ESC(Escape) 换码
DEL(Delete) 删除
在ASCII码表中,其余的95个为普通字符。其中SP(Space)为空格;数字字符0~9按照顺序排列,其编码为011 0000~011 1001,对应十进制是48~57;大写字母A~Z按照顺序排列,编码为100 0001~101 1010,对应十进制是65~90;小写字母a~z也是按照顺序排列,编码为110 0001~111 1010,对应十进制是97~122;大写字母与对应的小写字母的编码相差32。
由于计算机中普遍采用8个二进制位为1个字节,所以计算机中ASCII码的b7位通常置为0,并称之为基本ASCII码。也可以将b7位置为1,然后另外安排128个字符(如希腊字母等),通常称之为扩展ASCII码。在传输西文字符信息时,也常将b7位作为奇偶校验位。
西文字符除了常用的ASCII编码外,有时也采用EBCDIC编码(Extended Binary Coded Decimal Interchange Code,扩展二—十进制交换码),这种编码采用8位基2编码,可表示256个字符,主要用在大型计算机中。
西文信息是由西文字符组成的,在计算机的输入、处理、存储、传输时可以统一采用ASCII编码。中文信息是由汉字组成的,汉字为象形文字,字种多、字形杂,编码比较困难。在计算机处理汉字时,输入、处理、存储、传输、输出的各个环节的编码要求各不相同,所以需要进行一系列的编码和转换,通常情况下的流程如图1-2所示。
图1-2 计算机处理汉字的流程
(1)GB2312—80汉字字符集与编码。
为了适应计算机系统处理汉字的需要,我国在1981年颁布了《信息交换用汉字编码字符集基本集》(GB 2312—80)的强制性国家标准。它的编码方式如图1-3所示。
整个字符集是一个二维平面,排成一张94行×94列的字符表。表中的行称为区,表中的列称为位。表中每个字符的代码由其行列位置决定,字符代码的二进制值由两个字节组成,由行位置决定的代码为第一字节,由列位置决定的代码为第二字节。
字符集中的字符主要由三部分组成,从第1区到第9区是非汉字图形符号,共有682个;从第16区到第55区为3755个常用汉字,称为一级汉字,按照汉语拼音的字母顺序排列;从第56区到87区是3008个非常用汉字,称为二级汉字,按照偏旁部首顺序排列;从第10区到第15区和第88区到第94区为预留的空白区,留待扩充字符用。
· 国标区位码
由字符集中的字符的区和位所决定的代码,简称为区位码。区位码常用4位十进制数字符号表示,区号在前,位号在后。区位码也可以用两个7位二进制来表示,它们分别是区位号的二进制值,也是区号在前,位号在后,若是8位二进制,则b7位置为0。
例如:一级汉字中的“啊”,其区号为16,位号为01,所以,其区位码是1601,即二进制的00010000 00000001;一级汉字中的“雹”,其区号为17,位号为02,所以,其区位码是1702,即二进制的00010001 00000010;二级汉字中的“丐”,其区号为56,位号为04,所以,其区位码是5604,即二进制的00111000 00000100。
图1-3 GB 2312—80的编码方式
· 国标交换码
国标交换码简称为国标码,也常称为交换码。国标码是GB 2312—80编码字符集所规定的代码,为两个7位二进制所组成的代码。由于计算机中用8个二进制位作为一个字节,所以国标码用两个字节表示(最高位b7置为0),并用十六进制表示。
国标码与区位码之间存在简单的对应关系:国标码=区位码+2020H,从十进制角度来说,就是将区位码的区号和位号分别加上32,这样做的目的是为了防止国标码的两个字节的值与ASCII码的控制字符发生冲突。
例如:一级汉字中的“啊”,其区位码是1601,即二进制的00010000 00000001,其国标码的十进制为4833,二进制为00110000 00100001,即3021H;一级汉字中的“雹”,其区位码是1702,即二进制的00010001 00000010,其国标码的十进制为4934,二进制为00110001 00100010,即3122H;二级汉字中的“丐”,其区位码是5604,即二进制的00111000 00000100,其国标码的十进制为8836,二进制为01011000 00100100,即5824H。
· 汉字机内码
汉字机内码简称内码,是汉字处理系统中存储、处理、传输汉字时所用的代码。
在西文处理系统中,没有交换码和机内码之分,即直接使用交换码作为机内码。而在汉字处理系统中,如果直接使用国标交换码,就会造成汉字代码与西文代码的混淆,因而在汉字处理系统中必须使用机内码。
机内码的编码原则是能够严格区分西文字符的代码(ASCII码)和汉字字符的代码(汉字机内码),并且兼顾其与国标代码的对应,转换规则应尽量简单,还要考虑到显示及打印输出时的系统操作体制。目前常用的机内码的编码方法是:将表示汉字的国标码的两个字节的最高位设置为1。这样,在汉字处理系统中,如果字符信息的最高位为0,表示其是由ASCII码表示的西文字符,就将它作为西文字符处理;如果字符信息的最高位为1,就检测下一个字符信息的最高位是否也为1,如果是,表示这两个字节的字符信息表示一个汉字,就将其作为汉字进行处理。
汉字的国标码、区位码、机内码之间的对应关系可表示为:
机内码=国标码+8080H=区位码+A0A0H
从十进制角度来说,将汉字的区位码的区号和位号分别加上32,就组成汉字国标码的十进制形式,将汉字的区位码的区号和位号分别加上(32+128),就组成汉字机内码的十进制形式。
例如:“啊”的区位码是1601,二进制为00010000 00000001,国标码为3021H,二进制为00110000 00100001,机内码为B0A1H,二进制为10110000 10100001;“雹”的区位码是1702,二进制为00010001 00000010,国标码为3122H,二进制为00110001 00100010,机内码为B1A2H,二进制为10110001 10100010;“丐”的区位码是5604,二进制为00111000 00000100,国标码为5824H,二进制为01011000 00100100,机内码为D8A4H,二进制为11011000 10100100。
应当说明,GB 2312—80是强制执行的国家标准,所以汉字的国标码和区位码是唯一的,而机内码则是汉字在计算机系统内部的编码,可以采取不同的编码方法,所以不是唯一的。
(2)汉字字符的输入编码。
计算机汉字输入技术是计算机汉字处理技术的一个重要组成部分。为了使用常规的西文键盘直接输入汉字,必须对要输入的汉字进行编码,也就是用若干个字母、数字或符号的组合来表示一个汉字,通过这种编码方式把汉字输入到计算机系统中,然后由相应的程序转换为该汉字的机内码或国标码,以利于汉字的存储、处理及传输。
目前,汉字的输入技术研究发展非常迅速,已经有好几百种汉字输入方法得到应用。通常,衡量一种输入方法的优劣的标准为:
① 规则简单,便于学习和掌握。
② 重码较少,便于输入和实现盲打。
③ 编码的码长较短,以利于提高输入速度。
目前通常所采用的汉字输入编码方式有以下几种:
· 按照字音编码方式
这种输入编码方式通常是以国家文字改革委员会公布的汉语拼音方案为基础,以输入汉字的汉语拼音进行汉字输入。只要掌握汉语拼音就可以方便地输入汉字,但是由于汉字的同音字较多,所以必须进行重码选择,影响输入速度的提高。这类输入编码简单易学,适合非专业人员使用,是目前使用最广泛的一类输入编码方式。智能ABC、微软拼音、全拼输入法、紫光拼音输入法等都属于这一类。
· 按照字形编码方式
这种输入编码方式根据汉字属于象形文字的特点,把汉字的偏旁部首、间架结构等字形特征用一些字母和数字来代表,通过输入这些汉字的特征来输入汉字。这类编码的编码规则通常比较复杂,给学习和掌握带来一定困难,但是由于这类编码的重码率低,容易实现高速盲打,在专业文字录入人员中应用比较广泛。五笔字型码和表形码是其中的主要代表。
· 字音与字形结合的编码方式
字音编码简单易学,但同音字会造成重码,另外方言、口音及生僻字也影响使用。字形编码形象直观,但规则相对比较复杂,学习掌握比较困难。以字音与字形结合的编码方式提取汉字的字音和字形两个方面的信息来为汉字进行编码,能够较好地避免字音编码和字形编码各自的缺陷。音形编码可以以音为主、以形为辅,也可以以形为主、以音为辅。该类编码规则相对比较简单,重码也少,但要求使用者具有字音与字形两方面的基本知识。这类编码比较常用的有自然码和快速码。
· 数字流水编码方式
数字流水编码方式的基本思想是将所有被编码的汉字按照一定顺序排列起来,用数字按照某种规则对每个汉字进行编码。电报码输入法、国标码输入法、区位码输入法都属于该类编码方式。数字流水编码方式的码长通常是相等的,熟练后可以做到快速盲打,但是由于编码的记忆量非常大,所以只在特殊场合下使用。
(3)汉字字符的字形编码。
字形码的作用是把汉字某种编码转换为人们可以阅读的方块字形象,当计算机系统需要对汉字字符进行显示输出或打印输出时,需要用到字形码。也就是说,汉字的字形编码描述了汉字的形象。
字符集中所有汉字的字形描述信息集合为字库(字形信息库),不同的字体(如黑体、楷体)字形(如粗体、斜体)对应不同的字库,它们都必须预先存储在计算机中,当需要输出汉字时,应用程序从字库中找到相应的字形描述信息,然后进行输出。
汉字字形的描述方法有轮廓法和点阵法两种。轮廓法将汉字的字形转化为一组直线和曲线,并记录这些直线和曲线的数学描述数据,当需要输出时再将这些数据转化为字形。这种方式的描述精度较高、字形美观、放大缩小不会引起失真,但对计算机软件硬件的要求较高,目前被广泛使用,Windows系统的TrueType字库就是使用这种描述方法。点阵法将汉字的字形离散为由点组成的方阵,每个点用一位二进制数据描述,由此组成汉字的字形点阵(称为字模)。由于计算机系统的显示和打印输出本质上都是通过点阵方式实现的,所以点阵方式对计算机系统的软件、硬件的要求相对较低,但点阵汉字在放大后会出现锯齿状失真,目前只在一些比较简单的系统和字符界面的系统中被使用。
图1-4 汉字的点阵
|
由于点阵中的每一个点要用一个二进制位来描述,所以该字模将占据16′16?8=32个字节的存储空间,GB 2312—80字符集收录了682+3755+3008=7445个字符,所以16′16点阵的一个字库要使用32′7445=238240B≈233KB的存储空间。
汉字字形在字库中的相对位移地址称为该汉字的地址码,需要输出汉字时,由汉字机内码计算得到汉字地址码,由地址码从字库中得到汉字的字形,然后送往显示输出设备。
(4)计算机处理汉字字符的基本过程。
计算机处理汉字字符的基本过程如图1-5所示。
图1-5 计算机处理汉字的基本过程
在通过键盘向计算机输入汉字时,从键盘上输入的是某个汉字的输入码,输入码送入键盘管理程序进行处理,键盘管理程序根据输入码在汉字机内码码表中进行检索,将输入码转换为该汉字所对应的机内码。当计算机需要与其他计算机交换汉字信息时,通信管理程序负责将汉字的机内码转换为对应的汉字交换码,或是将汉字的交换码转换为对应的汉字机内码,以实现汉字信息的交换和传输。在汉字字符的显示输出或打印输出的过程中,字库管理程序将汉字字符的机内码转换为表示该汉字字形在字库中位置的地址码,然后根据地址码从字库中取得汉字字符的字形码,通过显示程序显示字符或通过打印程序打印字符。
汉字在计算机中存储和处理的过程中都是以机内码的形式存在的,由于汉字字符的机内码、交换码、输入码以及字形码的编码方式与西文字符的编码方式不同,所以相应程序能够正确区分汉字字符和西文字符,从而做出正确的处理。需要指出的是,由于汉字字符存在多种编码方式,各种编码方式之间常常不能完全兼容(有时甚至完全不兼容),所以一种汉字系统中的汉字信息如果直接在另一种汉字系统中使用,就有可能造成不能正确识别的结果。例如在不同的汉字系统之间传递带有汉字信息的邮件,就有可能造成“乱码”。
汉字输入是计算机汉字信息处理的必不可少的步骤,传统的键盘汉字输入方法要求用户掌握相关的汉字输入规则,给大多数计算机使用者带来了很大的负担,而且汉字的键盘输入存在同音字重码或拆字困难等缺陷。长期以来,人们一直在探索更简单、更直接、更符合人们平时习惯的汉字输入方式。汉字的非键盘输入技术是目前计算机技术发展的前沿之一,它通常包括汉字的语音识别技术、汉字的光学字符识别技术、汉字的手写识别技术三个方面。
汉字的语音输入是借助人工智能技术对语音信息进行模式识别,从语音信息中分析推断出语音中所包含的汉字信息,并将其转换成相应的汉字标准编码,从而实现汉字输入的一种汉字输入技术。这种方法中具有代表性的是IBM公司的“ViaVoice连续语音识别系统”和我国汉王科技公司的“智能语音识别输入系统”。
光学字符识别的缩写是OCR(Optical Character Recognition),通常简称为文字识别,它的工作原理为:通过扫描仪或数码相机等光学输入设备获取纸张上的文字图片信息,利用各种模式识别算法分析文字形态特征,判断出汉字的标准编码,并按通用格式存储在文件中。由此可以看出,OCR实际上是让计算机认字,实现文字自动输入。它是一种快捷、省力、高效的文字输入方法。这种方法中具有代表性的是汉王科技公司的OCR软件和清华紫光科技公司的OCR软件。
汉字的手写识别技术是通过手写笔等轨迹捕获设备记录书写者的书写信息,然后利用人工智能技术进行模式识别,提取手写信息中的汉字信息,并将其转换为汉字相应的标准编码。目前我国在汉字的手写识别技术上走在世界前列,不仅突破了手写识别对笔顺的依赖,而且实现了汉字工整字识别——连笔字识别——行草字识别的跨越,并且可以识别GB18030字符集的所有汉字。