1.4 计算机中的信息表示
1.4.1 信息与数据
在计算机系统中,数据是计算机加工处理的对象,凡是能够被计算机接受并处理的都是数据,它不仅指数值,还包括字母、汉字、声音、图形、图像等。信息所表达的含义反映的是现实的概念,不随载荷它的物理设备的不同而不同;数据则是信息的具体表现,是信息的载体。
1.4.2 二进制信息
计算机采用二进制码0和1的组合来表示所有的信息,即计算机采用二进制编码。计算机存储器中存储的都是由0和1组成的信息编码,它们分别代表各自不同的含义,有的表示计算机指令与程序,有的表示二进制数据,有的表示英文字母,有的表示汉字,还有的表示色彩与声音,它们分别采用各自不同的编码方案。
虽然计算机内部采用二进制编码来表示各种信息,但计算机与外部交往仍采用人们熟悉和便于阅读的形式,如十进制数据、中英文文字显示及图形描述。二进制和十进制之间的转换则由计算机系统内部来实现。
与十进制码相比,二进制码并不符合人们的习惯,但是计算机内部仍采用二进制编码表示信息,主要原因有以下4点。
(1)电路简单:二进制数中只有0和1两个数码,易于用两种对立的物理状态表示。例如:用开关的闭合与断开两种状态分别表示1和0;用电脉冲有与无两种状态分别表示1和0。一切有两种对立稳定状态的器件(即双稳态器件)均可表示二进制的0和1。十进制数有10个数码,需要一个10稳态的器件,显然设计有两种状态的器件要容易得多。
(2)可靠性高:计算机中实现双稳态器件的电路简单,并且两种状态所代表的两个数码在数字传输和处理中不容易出错,因而电路可靠性高。
(3)运算简单:在二进制中算术运算特别简单,可大大简化计算机中运算电路的设计。相对而言,十进制的运算规则复杂很多。
(4)易于逻辑运算:计算机的工作离不开逻辑运算,二进制数码的1和0正好可与逻辑命题的两个值“真”(True)与“假”(False)或“是”(Yes)与“否”(No)相对应,这样就为计算机的逻辑运算和程序中的逻辑判断提供了方便,使逻辑代数成为计算机电路设计的数学基础。
1.4.3 数据存储单位
计算机中的数据包括数值数据和非数值数据。数值数据有量的大小,而非数值数据是字符、声音、图形和动画等。所有的数据在计算机中都是用二进制形式表示和存储的。计算机常用的存储单位有位、字节和字。
(1)位(bit):一个二进制位称为比特,它是计算机中存储数据的最小单位。一个二进制位只能表示0或1两种状态之一。
(2)字节(byte):8个二进制位称为字节,通常用B表示,字节是计算机数据处理和存储的基本单位。
(3)字(word):一个字由若干字节组成(通常取字节的整数倍),是计算机一次存取、加工和传送的数据长度。
计算机存储容量的大小是用字节的多少来衡量的,通常使用的衡量单位有B、KB、MB、GB、TB,其中B代表字节。这些衡量单位之间的换算关系如下。
1KB=1 024B 1MB=1 024KB
1GB=1 024MB 1TB=1 024GB
1.4.4 计算机的基本运算
在计算机中,采用二进制可实现各种算术运算和逻辑运算。二进制算术运算包括加法、减法、乘法和除法,其运算规则类似于十进制数的运算。
1.算术运算
(1)加法运算
二进制的加法运算法则如下。
0+0=0
0+1=1+0=1
1+1=0(向高位有进位)
1+1+1=1(向高位有进位)
例如,(1101)2+(1011)2的算式如下。
从执行加法的运算过程可知,两个二进制数相加时,每一位是3个数相加,即本位被加数、加数和来自低位的进位。进位可能是0,也可能是1。
(2)减法运算
二进制的减法运算法则如下。
0-0=1-1=0
1-0=1
0-1=1(向高位借位)
0-1-1=0(向高位借位)
例如,(11000011)2-(00101101)2的算式如下。
从执行减法的运算过程可知,两数相减时,有的位会发生不够减的情况,这时要向相邻的高位借位,借1当2。所以,做减法时除了每位相减,还要考虑借位情况,实际上每位也是3个数参加运算。
(3)乘法运算
二进制的乘法运算法则如下。
0×0=0
0×1=1×0=0
1×1=1
例如,(1110)2×(1101)2的算式如下。
从执行乘法的运算过程可知,两数相乘时,每个部分积都取决于乘数。乘数的相应位为1时,该次的部分积等于被乘数;为0时,部分积为0。每次的部分积依次左移一位,将各部分积累加起来,就得到最终乘积。
(4)除法运算
二进制的除法运算法则如下。
0÷0=0
0÷1=0(1÷0无意义)
1÷1=1
例如,(100110)2÷(110)2得商(110)2和余数(10)2,其算式如下。
由上可见,二进制除法运算与十进制除法运算类似。对整数除法可以先从被除数的最高位开始,将被除数(或中间余数)与除数比较,若被除数(或中间余数)大于除数,则被除数(或中间余数)减去除数,商1,并将相减之后得到的中间余数左移一位(中间余数的最低位用下一位被除数补充)作为下一次的中间余数。若被除数(或中间余数)小于除数,则不做减法,商0,并将本次的中间余数左移一位(中间余数的最低位用下一位被除数补充),得下一位的中间余数。如此逐次进行比较、相减和移位,就可得到所要求的各位商数和最终的余数。
2.逻辑运算
(1)逻辑或运算
运算符:“+”或“∨”。运算规则如下。
① 0+0=0 或 0∨0=0
② 0+1=1 或 0∨1=1
③ 1+0=1 或 1∨0=1
④ 1+1=1 或 1∨1=1
例如,(110101)2∨(101100)2=(111101)2,其算式如下。
(2)逻辑与运算
运算符:“×”或“∧”。运算规则如下。
① 0×0=0 或 0∧0=0
② 0×1=0 或 0∧1=0
③ 1×0=0 或 1∧0=0
④ 1×1=1 或 1∧1=1
例如,(101101)2∧(110110)2=(100100)2。
(3)逻辑非运算
运算符:“-”。运算规则:0的非为1;1的非为0。例如,X=100101,则。
1.4.5 数制及转换
1.数制的基本概念
在日常生活中,常用不同的规则来记录不同的数,如1年有12个月,1h为60min,1min为60s,1m为10dm,1dm为10cm等。按进位的方法,表示一个数的计数方法称为进位计数制,又称数制。在进位计数制中,较常见的是十进制,此外还有十二进制、十六进制等。在计算机科学中使用的是二进制,但有时为了方便也使用八进制、十六进制。构成数制的两个要素是基数和位权。
基数:在一个数中的每个数位(指数码在一个数中所处的位置)上可能出现的不同数字的个数。例如,二进制数的基数是2,十进制数的基数为10。
位权:某个位置上的数所代表的数量大小,它表示此数在整个数中所占的分量(权重)。
(1)十进制
十进制计数法(Decimal Notation)的进位规则为“逢10进1”,一个十进制数的每位都只有10种状态,分别用数符(数码)0~9表示,任何一个十进制数都可以表示为数符与10的幂次乘积之和。例如,十进制数5 296.45可写成如下形式。
5 296.45=5×103+2×102+9×101+6×100+4×10-1+5×10-2
上式称为数值按位权多项式展开,其中10 的各次幂称为十进制数的位权,10称为基数。
(2)二进制
二进制计数法(Binary Notation)的进位规则为“逢2进1”,每位只有0和1两种状态,位权为2的各次幂。任何一个二进制数,同样可以用多项式之和来表示,如二进制数1011.01可以写成如下形式。
1011.01=1×23+0×22+1×21+1×20+0×2-1+1×2-2
二进制数整数部分的位权从最低位开始依次是20,21,22,23,24,…,小数部分的位权从最高位开始依次是2–1,2–2,2–3,2–4,…,二进制数小数部分的位权与十进制数值的对应关系如表1.1所示。
表1.1 二进制数小数部分的位权与十进制数值的对应关系
(3)八进制和十六进制
八进制数的基数为8,进位规则为“逢8进1”,使用0~7共8个符号,位权是8的各次幂。例如,八进制数3 626.71可以表示如下。
3 626.71=3×83+6×82+2×81+6×80+7×8-1+1×8-2
十六进制数的基数为16,进位规则为“逢16进1”,使用0~9以及A、B、C、D、E、F共16个符号,其中A~F的十进制数值为10~15。位权是16的各次幂。例如,十六进制数1B6D.4A可表示如下。
1B6D.4A=1×163+11×162+6×161+13×160+4×16-1+10×16-2
各种进制数的表示方式如表1.2所示,表中,i=0,1,2,3,…,n,为数位的编号,表示数的某一数位。
表1.2 十进制和计算机中常用进制的表示方式
(4)进位计数制的表示
综合以上几种进位计数制,可以概括出:对于任意进位的计数制,基数可以用正整数R来表示,称为R进制。这时数N表示为多项式。
式中,m和n均为正整数(可以是0),ki则是0,1,…,R–1中的任何一个;Ri是位权,采用“逢R进1”的原则进行计数。常用的几种进位计数制的表示方法及其相互之间的对应关系见表1.3。
表1.3 常用进位计数制间的对应关系
4种进位计数制在书写时有以下3种表示方法。
① 在数字的后面加上下标(2)、(8)、(10)、(16),分别表示二进制、八进制、十进制和十六进制的数。
② 把一串数用括号括起来,再加上这种进位计数制的下标2、8、10、16。
③ 在数字的后面加上进制的字母符号[B(二进制)、O(八进制)、D(十进制)、H(十六进制)]来表示。
例如,10110101(2)=265(8)=181(10)=B5(16),也可表示为(10110101)2=(265)8=(181)10=(B5)16或10110101B=265O=181D=B5H。
2.不同计数制之间的转换
不同计数制之间的转换包括:非十进制数转换为十进制数,十进制数转换为非十进制数,非十进制数之间的转换。
(1)二进制数、八进制数、十六进制数转换为十进制数
将二进制数、八进制数、十六进制数转换为十进制数,可以简单地按照多项式求和的方法直接计算出。例如,
(101.01)2=1×22+0×21+1×20+0×2-1+1×2-2=(5.25)10
(2 576.2)8=2×83+5×82+7×81+6×80+2×8-1=(1 406.25)10
(1A4D)16=1×163+10×162+4×161+13×160=(6 733)10
(F.B)16=15×160+11×16-1=(15.687 5)10
(2)十进制数转换成非十进制数
将一个十进制数转换成二进制数、八进制数、十六进制数时,其整数部分和小数部分分别遵守不同的规则。下面先以十进制数转换成二进制数为例进行说明。
① 十进制整数转换成二进制整数
十进制整数转换成二进制整数时,采用的规则通常是“除2取余,逆序读数”,即把已知十进制数反复除以2,每次相除后若余数为1,则对应二进制数的相应位为1;若余数为0,则相应位为0。首次相除得到的余数是二进制数的最低位,后面的余数为高位。从低位到高位逐次进行,直到商为0。
例1.1(13)10=()2?
解:该数为整数,用“除2取余法”,即把该整数反复用2除,直到商为0;再将余数依次排列,先得出的余数在低位,后得出的余数在高位。
由此可得(13)10=(1101)2。
同理,可将十进制整数通过“除8取余,逆序读数”和“除16取余,逆序读数”分别转换成八进制整数和十六进制整数。
② 十进制纯小数转换成二进制纯小数
十进制纯小数转换成二进制纯小数采用的规则为“乘2取整,顺序读取”,即把已知十进制纯小数反复乘以2,每次乘以2后所得新数的整数部分若为1,则二进制纯小数的相应位为1;若整数部分为0,则相应位为0。从高位向低位逐次进行,直到满足精度要求或乘以2后的小数部分是0为止。
例1.2(0.312 5)10=()2?
解:
由此可得(0.312 5)10=(0.010 1)2。
多次乘以2的过程可能是有限的,也可能是无限的。当乘以2后得到的数小数部分等于0时,转换即告结束。当乘以2后得到的数小数部分总不为0时,转换过程将是无限的,这时应根据精度要求取近似值。若未提出精度要求,则一般小数位数取6位;若提出了精度要求,则按照精度要求取相应的位数。
同理,可将十进制纯小数通过“乘8(或16)取整,顺序读取”转换成相应的八(或十六)进制纯小数。
③ 十进制混合小数转换成二进制数
混合小数由整数和小数两部分组成,将其整数部分和小数部分分别进行转换,然后再用小数点连接起来,即可得到所要求的二进制数。
例1.3(13.312 5)10=()2?
解:只需将前面两例的结果用小数点连接起来即可。可得(13.312 5)10=(1101.0101)2。
上述将十进制数转换成二进制数的方法,同样适用于将十进制数转换成八进制数和十六进制数,只不过所用基数不同而已。
例1.4 求(58.5)10=()8。
解:先求整数部分,除8取余。
再求小数部分,乘8取整。
0.5×8=4.0 取 4
整数部分与小数部分用小数点相连,得结果为(58.5)10=(72.4)8。
例1.5 将十进制数4 586.32转换成十六进制数(取4位小数)。
解:先求整数部分,除16取余。
再求小数部分,乘16取整。
两部分用小数点相连,得结果为(4 586.32)10=(11EA.51EB)16。
(3)非十进制数之间的转换
非十进制数之间的转换包括二进制数与八进制数之间的转换、二进制数与十六进制数之间的转换等。
① 二进制数转换成八进制数
由于23=8,每位八进制数都相当于3位二进制数,因此,将二进制数转换成八进制数时,只需以小数点为界,分别向左、向右将每3位二进制数分为一组,最后不足3位时用0补足3位(整数部分在高位补0,小数部分在低位补0),将每组分别用对应的1位八进制数替换,即可完成转换。
例1.6 把(11010101.0100101)2转换成八进制数。
解:
可得(11010101.0100101)2=(325.224)8。
② 八进制数转换成二进制数
由于八进制数的1位相当于二进制数的3位,因此将八进制数的每位用相应的3位二进制数替换,即可完成转换。
例1.7 把(652.307)8转换成二进制数。
解:
可得(652.307)8=(110101010.011000111)2。
③ 二进制数转换成十六进制数
由于24=16,1位十六进制数相当于4位二进制数,因此仿照二进制数与八进制数之间的转换方法,很容易得到二进制数与十六进制数之间的转换方法。
对于二进制数转换成十六进制数,只需以小数点为界,分别向左、向右将每4位二进制数分为1组,不足4位时用0补足4位(整数部分在高位补0,小数部分在低位补0)。然后将每组分别用对应的1位十六进制数替换,即可完成转换。
例1.8 把(1011010101.0111101)2转换成十六进制数。
解:
可得(1011010101.0111101)2=(2D5.7A)16。
④ 十六进制数转换成二进制数
对于十六进制数转换成二进制数,将十六进制数的每位用相应的4位二进制数替换,即可完成转换。
例1.9 把(1C5.1B)16转换成二进制数。
解:
可得(1C5.1B)16=(111000101.00011011)2。
1.4.6 字符的计算机编码
1.字符编码的基本知识
字符是各种文字和符号的总称,包括各国文字、标点符号、图形符号、数字以及一般不可见的控制字符。字符编码是指将字符表示为一个二进制数。
字符集是字符的集合,有时也称编码字符集,字符集为每个字符分配一个唯一的整数。
代码点是指可用于编码字符集的整数。由编码字符集定义的代码点的取值范围称为编码空间。每个代码点表示一个字符,或被声明为未使用。
字符编码方案是从编码空间的每个代码点到1个或多个固定宽度编码单元序列的映射。编码单元是表示代码点的基本二进制序列,一般为8bit、16bit或32bit。通常每个代码点只需用1个编码单元表示,但如果编码单元的表示范围小于编码空间,则需要用多个编码单元来表示一个代码点。由于字节是计算机最基本的数据表示单位,因此编码单元最终将转换为字节序列。
对字符的完整编码过程为:先为字符分配一个代码点,然后用1个或多个编码单元表示,最后转换为直接用二进制数表示的字节序列。
2.ASCII码及其ANSI扩展
ASCII码用于编码国际上通用的西文字符。ASCII码一般使用8bit(1个字节)编码单元表示字符,最高位恒为0,只用低7bit对字符进行编码,能表示27=128种字符。如表1.4所示,ASCII字符集包括26个大写字母A~Z(码值为65~90)、26个小写字母a~z(码值为97~122)、10个数字0~9(码值为48~57)、32个标点符号和运算符、1个空格(码值为32)以及33个控制字符(码值为0~31和127)。
表1.4 ASCII字符编码
续表
由表1.4不难看出,每个ASCII码由一个高3bit组(b6b5b4)和一个低4bit组(b3b2b1b0)构成。例如:回车符“CR”的ASCII码为0001101,可用十六进制数0DH表示;换行符“LF”的ASCII码为0001010,可用十六进制数0AH表示;数字“9”的ASCII码为0111001,可用十六进制数39H表示;字母“W”的ASCII码为1010111,可用十六进制数57H表示。
由于ASCII码只使用单字节编码单元中的低7bit,因此ASCII码可被扩展。在美国国家标准学会(American National Standards Institute,ANSI)标准中,ASCII扩展字符集仍然使用单字节编码单元,要求ASCII码必须用一个等值的、高位为0的编码单元表示。但对于其他高位为1的编码单元,则依赖于特定字符集的具体定义。通常,我们将按ANSI标准派生的ASCII扩展字符集统称为ANSI字符集(如Latin-1、GB2312、Big-5等),有时也称多字节字符集。
3.汉字编码
汉字也是一种字符,通常把汉字在计算机中的二进制数表示称为汉字的机内码(或称汉字内码)。汉字内码的编制依赖于编码规则,常用汉字编码标准有GB2312、Big-5、《汉字内码扩展规范》(GBK)、通用码(Unicode)等。
(1)GB2312
GB2312或GB2312-80是简体中文字符集的国家标准,其简称为国标码。我国几乎所有的中文系统和国际化的软件都支持GB2312。
① 国标字符集与区位码
GB2312-80标准共包括6 763个汉字,按汉字的使用频率,分为一级汉字(3 755个)和二级汉字(3 008个)。在GB2312-80标准中,所有符号按区位编排,共设94区,每区含有94个汉字和符号。一级汉字按拼音顺序排列,占据16~55区;二级汉字按部首顺序排列,占据56~87区;前15区用来编排西文字母、数字、图形符号,以及用户自定义的专用符号;目前,10~15区空着。国标码(GB2312-80)编排如表1.5所示。
表1.5 GB2312-80汉字编码
在国标GB2312-80中,国标码除了用双7位二进制数表示,还可以表示成区位码的形式,即在国标代码表中,将行号称为区号,将列号称为位号,分别有94个区和94个位。区号和位号用十进制数表示,不足两位时前面补0。这样,每个汉字或符号都可用4位十进制数表示。因此,区位码可以用作输入码,是汉字输入的基本编码方法之一。区位码与国标码有如下的对应关系。
汉字国标码=汉字区位码(十六进制)+2020H
例如,汉字“大”的区号为20,位号为83,即“大”的区位码为2083(1453H);“大”的国标码为3473H(1453H+2020H)。
② 汉字机内码
在计算机中双字节汉字与单字节西文字符混合使用,汉字编码的各个字节若不予以特别标识,就会与单字节的ASCII码混淆不清;为此,将标识汉字的两个字节编码的最高位置为1,这种最高位为1的双字节汉字编码就是汉字机内码,简称内码,是计算机内部存储、处理汉字所使用的代码。机内码在相应国标码的每个字节最高位上加“1”,即:
汉字机内码=汉字国标码+8080H
需要特别注意的是,汉字的区位码是用十进制数表示的,通常记为“区号-位号”。在进行国标码、区位码、机内码3种汉字编码的转换时,千万不要忘记先将十进制的区位码转换成十六进制,再利用上述关系式进行转换。
内码、国标码、区位码3者的关系如下。
高字节内码=高字节国标码+80H=区码+20H+80H=区码+0A0H
低字节内码=低字节国标码+80H=位码+20H+80H=位码+0A0H
③ 汉字字形码
汉字机内码不可能直接在屏幕上显示和在打印机上输出,必须把它转换成对应的汉字字形码。汉字字形码是指确定一个汉字字形点阵的代码,又称为汉字字模码或汉字输出码。在一个汉字点阵中,凡笔画所到之处,记为“1”,否则记为“0”。汉字的字形通常采用点阵的方式产生。汉字点阵有16×16点阵、32×32点阵、64×64点阵等,点阵不同,汉字字形码的长度也不同。点阵数越大,字形质量越高,字形码占用的字节数越多。
图1.14显示了“国”字的24×24点阵字形。深色小正方形表示二进制位的信息“1”,浅色小正方形表示二进制位的信息“0”。
图1.14 汉字点阵
汉字字形码又称为汉字输出码或汉字发生器的编码。
④ 汉字输入码
汉字输入码也称外码,是指从键盘上输入的代表汉字的编码。汉字输入码有多种,大致可分为以下4类。
流水码:根据汉字的排列顺序形成汉字编码,如区位码、国标码、电报码等。流水码输入法简单唯一,但较难记忆和掌握。
音码:根据汉字的读音进行编码,如全拼码、双拼码、简拼码等。音码输入法易于掌握,懂汉语拼音即可,但重码率高,不便于盲打。
形码:根据汉字的字形进行编码,如王码五笔、郑码、大众码等。
音形码:根据汉字的字音和字形进行汉字编码,如表形码、首尾码等。
多数汉字输入法都提供了重码字辅助选择、词组输入、联想输入等功能,以方便用户输入汉字。不论是哪一种汉字输入方法,利用输入码将汉字输入计算机后,都必须将其转换为汉字机内码,才能进行相应的存储和处理。
(2)Big-5
Big-5是一种繁体字编码方案,又称大五码。Big-5码收录了符号和汉字共13 461个,每个汉字由两个字节构成,第一个字节的范围是A0H~FEH,第二个字节的范围不连续,分别为40H~7EH和A1H~FEH,因此,汉字第一个字节的最高位总是1,第二个字节的最高位可能是1或0。
(3)GBK
GBK 是一种汉字编码标准,是在GB2312-80标准基础上的内码扩展规范,它使用了双字节编码方案,其编码范围是8140H~FEFEH,共23 940个码位,共收录了21 003个汉字,完全兼容GB2312-80标准,并包含了Big-5编码中的所有汉字。
(4)Unicode编码
Unicode 是当前国际上通用的字符编码规范,它为全世界所有语言的每个字符都设定了统一且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,它由Unicode学术学会制订,于1990年开始研发,1994年正式公布。
在Unicode出现前,有数百种字符编码系统,但没有任何一种编码能够包含足够的字符,并且这些编码系统相互之间存在冲突。而 Unicode 正在改变这一切,Unicode 标准已经被计算机业界接受,许多操作系统、各种浏览器以及许多其他软件产品都支持Unicode。