信息技术基础与应用(上册)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

任务1.6 掌握计算机中信息的表示、存储与编码规则

1.6.1 学习要点

◆ 了解数制的概念与要素

◆ 理解二进制的特点

◆ 掌握二进制、八进制、十进制、十六进制的书写规则

◆ 掌握二进制、八进制、十进制、十六进制的相互转换方法

◆ 掌握有符号数的原码、反码、补码的表示与相互转换规则

◆ 掌握常用信息单位及换算规则

◆ 掌握数字与字符的常用编码规则

1.6.2 知识准备

信息在计算机中主要分为控制信息和数据信息,都是以0或1表示的。控制信息是计算机系统内部运转时用到的控制命令,如读/写命令、中断信号、片选信号、复位信号、就绪信号等;数据信息指计算机可采集、传输、存储、运算、输出的各种数据,可分为数值数据、文本数据(字符、字符串)、多媒体数据(图像、音频、视频)等。

1. 数制

数制(计数制)是用一组固定符号和统一规则来表示数值的方法。按照进位方式计数的数制叫进位计数制,简称进制。

在日常生活通常以十进制进行计数。除了十进制计数,还有许多非十进制的计数方法,如计时(60秒为1分钟,60分钟为1小时)用的是六十进制计数;计年(每12个月为1年)用的是十二进制计数。计算机中的信息表示通常采用二进制、十进制、八进制和十六进制。不同的数制间可以进行进制转换。

任何进制都包含两个基本要素:数码、基数。

数码:指数制中用来表示数据的数字符号,如二进制有2个数码(0、1);十进制有10个数码(0、1、2、3、4、5、6、7、8、9)。

基数:指数制中使用数码的个数,如二进制的基数为2;十进制的基数为10。

位权:指数制中每个固定位置对应的单位值。对于N进制数,整数部分第i位的位权为N^(i-1),即基数的i-1次幂;而小数部分第j位的位权为N^-j,即基数的-j次幂。

例如,十进制数999.99中,5个数码都是9,但每个9代表的值却是不同的。

第1个数码9处于整数部分的第3位,它的位权为10^(3-1)=100,表示百位,即代表9个百。

第2个数码9处于整数部分的第2位,它的位权为10^(2-1)=10,表示十位,即代表9个十。

第3个数码9处于整数部分的第1位,它的位权为10^(1-1)=1,表示个位,即代表9个一。

第4个数码9处于小数部分的第1位,它的位权为10^-1=1/10,表示十分位,即代表9个十分之一。

第5个数码9处于小数部分的第2位,它的位权为10^-2=1/100,表示百分位,即代表9个百分之一。

按权展开式:任何进制都可以表示为各位数码本身的值与其位权的乘积之和,这个式子就称为这个数值的按权展开式。

例如,十进制数6524.25=6×103+5×102+2×101+4×100+2×10-1+5×10-2

二进制数1011.01=1×23+0×22+1×21+1×20+0×2-1+1×2-2

因此,任意一个n位整数和m位小数的r进制数Y都可表示为:

在计算机内部,无论是指令还是数据都是以二进制代码的形式出现的,即便是声音、图形等信息,也要转换成二进制代码的形式。

在计算机中采用二进制的优越性如下。

(1)易于实现

计算机是由逻辑电路组成的,逻辑电路通常只有两种状态,即开关的接通与断开,这两种状态正好可以用“1”和“0”表示。采用二进制数时,电子元器件只要具备两种稳定的状态就可表示为“0”和“1”这两个二进制数。在技术和物理上是很容易实现的,如氖灯的亮和灭、二极管的导通与截止等。如果采用十进制数,则每位都需要用一个具有10种稳定状态的电子元器件来表示,在技术和物理上实现起来就会比较困难。

(2)运算简单

二进制的运算规则十分简单,如求和与求积的算术运算式如下:

因此,两个二进制数的和、积运算组合各只有3种,则运算规则简单,有利于简化计算机内部结构,提高运算速度。

(3)可靠性高

用二进制表示数据具有抗干扰能力强、可靠性高等优点。因为每位数据只有高和低两种状态,当受到一定程度的干扰时,仍能可靠地分辨出来,所以在传输和处理中不容易出错,从而保证了计算机的高可靠性。

但是,二进制也有明显的缺点,即数字冗长、书写麻烦且容易出错、不便阅读。所以,在计算机技术文献的书写中,常用十六进制表示数字。

表1-1中列出了十进制数(0~16)与二进制数、八进制数和十六进制数之间的对应关系。

表1-1 二进制数、八进制数、十六进制数与十进制数的对应关系

2. 进制数的书写规则

为了区分各种进制数,常采用在进制数后面加上大写字母或数字下标两种方法来书写并加以区分。

(1)字母标识法

十进制数用D(Decimal)表示或省略,二进制数用B(Binary)来表示,八进制数用O(Octal)来表示,十六进制数用H(Hexadecimal)来表示。一般约定,D可省略,即无后缀的数字为十进制数字。

例如,十制数111表示为111D或者111;二进制数111表示为111B;八进制数111表示为111O;十六进制数111表示为111H。

(2)数字下标法

将进制数用圆括号括起来,并在括号后面加上进制基数下标。

例如,(110)2表示二进制数的110;(110)8表示八进制数的110;(110)10表示十进制数的110;(110)16表示十六进制数的110。

计算机常用进位制的表示如表1-2所示。

表1-2 计算机中常用进位制的表示

3. 进制间的转换

(1)其他进制数转换为十进制数

方法:将其他进制按权位展开,然后各项相加就得到相应的十进制数。

例如,N=(1011.01)B=(?)D

按权展开 N=1×23+0×22+1×21+1×20+0×2-1+1×2-2=8+0+2+1+0+0.25=(11.25)D

(2)将十进制数转换成其他进制数

方法:按整数部分和小数部分分别转换。

① 整数部分转换方法:除基取余法,即把要转换的数除以新进制的基数,取余数直到商为零,并将所得到的余数倒序排列。

② 小数部分转换方法:乘基取整法,即把要转换的数乘以新进制的基数,取整数直至乘积的小数部分为零或满足精度为止,并将每次乘以基数后所得到的整数顺序排列。

例如:(125.625)D=(?)B

图1-1 十进制数转换成二进制数的过程

转换结果为:(125.625)D=(1111101.101)B

注:十进制小数不一定能转换成完全等值的二进制小数,有时要取近似值。

用同样的方法,可将十进制数转换成八进制数和十六进制数,分别采用“除8取余,乘8取整”和“除16取余,乘16取整”法。

(3)二进制数与八进制数、十六进制数的相互转换

通常两个非十进制数之间的转换方法是先将被转换数转换为相应的十进制数,然后再将十进制数转换为其他进制数。由于二进制数、八进制数和十六进制数之间存在着特殊关系,即81=23,161=24,因此二进制数转换为八进制数、十六进制数时,把要转换的二进制数从低位到高位每3位或4位分成一组,高位不足时在有效位前面添“0”,然后把每组二进制数转换成八进制数或十六进制数即可。八进制数、十六进制数转换为二进制数时,把上面的过程反过来即可。

例如,将(11001110.01010111)2转换成八进制数。

将(574.623)8转换成二进制数。

将(11011 1110 0011 . 1001 011)2转换成十六进制数。

(4)八进制数与十六进制数的转换

八进制数和十六进制数之间不能直接转换,但可以通过二进制数或十进制数间接转换。如八进制数要转化为十六进制数,可以先把八进制数转化为二进制数,再由二进制数转化为十六进制数;同理,如果要把十六进制数转化为八进制数,也可先把十六进制数转化为二进制数,再把二进制数转化为八进制数。

4. 计算机中数值的表示

计算机中数据分为数值数据和非数值数据,数值数据又可分为无符号数和有符号数。数值数据是指可以参加算术运算的数据,如(123)10、(1001.101)2等。非数值数据指不参与算术运算的数据,如字符串“电话号码:2519603”“4的3倍等于12”等都是非数值数据。注意这两个例子中虽然都有数字,如2519603、4、3、12,但它们不能也不需要参加算术运算,故仍属非数值数据。

(1)无符号数

无符号数是指没有符号的数,多用于表示字符、地址和逻辑值等。计算机中的数均存放在寄存器中,通常称寄存器的位数为机器字长。在存放无符号数时,寄存器中的每一位均可用来存放数值;当存放有符号数时,则需要留出位置存放“符号”。因此,在机器字长相同时,无符号数与有符号数所对应的数值范围是不同的。以机器字长16位为例,无符号数的表示范围为0~(216-1=65535),而有符号数的表示范围为(-32768=2-15)~(+32767=215-1)。

(2)有符号数

有符号数指数值前面有表示正数或负数的符号。由于符号的正负,机器是无法识别的,因此在计算机中通常用0表示正,1表示负,并规定将它放在有效数字的前面,这样就组成了有符号数。

把符号“数字化”的数叫作机器数,而把带“+”或“-”符号的数叫作真值。一旦符号数字化后,符号和真值就形成了一种新的编码。有符号数主要有原码、补码、反码等表示形式。

需要注意的是,计算机内部一般使用补码而并非使用原码表示一个数。

① 有符号数的原码表示法

原码是机器数中最简单的一种表示形式,其符号位为0时表示正数,为1时表示负数,数值位就是真值的绝对值二进制数,因此,原码又称作带符号位的绝对值表示,如下面的8位二进制数:

[+1]= 0000 0001

[-1]= 1000 0001

第一位是符号位,所以8位二进制数的取值范围就是:

[1111 1111, 0111 1111],即[-127, 127]。

② 有符号数的反码表示法

反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各位取反。比如:

[+1]= [00000001]= [00000001]

[-1]= [10000001]= [11111110]

可见,如果一个反码表示的是负数,人脑是无法直观看出其数值的,通常需要将其转换成原码再计算。

③ 有符号数的补码表示法

补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1,即在反码的基础上+1。比如:

[+1]= [00000001]= [00000001]= [00000001]

[-1]= [10000001]= [11111110]= [11111111]

对于负数,补码的表示方式同样是人脑无法直观看出其数值的,通常也需要转换成原码再计算其数值。

既然原码可被人脑直接识别并用于计算表示方式,为什么还要用反码和补码呢?

这是因为,如果让计算机参与辨别运算数值的“符号位”,就需要单独设计“符号位”辨别的电路,这样会使计算机的基础电路设计变得更加复杂。如果将符号位也参与运算,如减去一个正数实际上等于加上一个负数,即1-1= 1 +(-1)= 0,这样机器就可以只设计加法电路而不需要设计减法电路,基础电路的设计也就更简单了。

按照这个思路,首先来看原码的运算过程,如要计算十进制的表达式:1-1=0。

1 - 1= 1 +(-1)= [00000001]+ [10000001]= [10000010]= -2

可见,如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的。

为了解决这个问题,就出现了反码,如同样计算十进制的表达式:1-1=0。

1 - 1= 1 +(-1)=[0000 0001]+[1000 0001]=[0000 0001]+[1111 1110]=[1111 1111]= [1000 0000]= -0

可以发现,用反码计算减法,结果的真值部分是正确的,但唯一的问题就出现在“0”这个特殊的数值上。虽然在人们的理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]和[1000 0000]两个编码表示0。

于是补码的出现就解决了0的符号及两个编码的问题,如同样计算十进制的表达式:1-1=0。

1-1= 1 +(-1)=[0000 0001]+[1000 0001]=[0000 0001]+[1111 1111]= [0000 0000]=

[0000 0000]

这样0用[0000 0000]表示,而以前出现的-0问题就不存在了,而且还可以用[1000 0000]表示-128:

(-1)+(-127)=[1000 0001]+[1111 1111]=[1111 1111]+[1000 0001]=[1000 0000]

-1-127的结果应该是-128,在用补码运算的结果中,[1000 0000]就是-128。可见,使用补码,不仅修复了0的符号及存在两个编码的问题,而且还能多表示一个最低数。这就是为什么8位二进制,使用原码或反码表示的范围为[-127, +127],而使用补码表示的范围为[-128, 127]的原因。

5. 计算机常用信息单位

由于计算机的内部指令和数据都是采用二进制表示的,因此,计算机系统中信息存储、处理也都是以二进制为基础的。

(1)位

一个二进制位称为位(bit),简写为b,它是计算机中最小的信息量单位。计算机中最直接、最基本的操作就是对二进制位的操作。

(2)字节

8位二进制数码编为一组,称为1字节(Byte),简写为B。

字节是计算机中用来表示存储空间大小的基本单位,如计算机内存的存储容量、磁盘的存储容量等都是以字节为单位表示的。

(3)其他单位

在实际使用中除用字节为单位表示存储容量外,还常用KB、MB、GB、TB、PB、EB、ZB、YB、BB等表示存储容量。它们之间的换算关系如下:

1B(Byte,字节)=8bit(bit,位);

1KB(KiloByte,千字节)=210B=1024B;

1MB(MegaByte,兆字节,简称“兆”)=220B=1024KB;

1GB(GigaByte,吉字节,又称“千兆”)=230B=1024MB;

1TB(TrillionByte,万亿字节,又称“太”字节)=240B=1024GB;

1PB(PetaByte,千万亿字节,又称“拍”字节)=250B=1024TB;

1EB(ExaByte,百亿亿字节,又称“艾”字节)=260B=1024PB;

1ZB(ZettaByte,十万亿亿字节,又称“泽”字节)=270B=1024EB;

1YB(YottaByte,一亿亿亿字节,又称“尧”字节)=280B=1024ZB;

1BB(BrontoByte,一千亿亿亿字节)=290B=1024YB。

6. 计算机信息的编码

所谓“编码”就是用二进制来表示数据的代码。数字化信息编码是把少量二进制符号(代码)根据一定规则组合起来,以表示大量复杂多样的信息的一种编码。

(1)数字编码

数字编码是用二进制数码按照一定规律来描述十进制数的一种编码,其中最常见的是8421码,或称BCD码(Binary-Code-Decimal)。它利用四位二进制代码进行编码,从高至低的位权分别为23、22、21、20,即8、4、2、1,用来表示一位十进制数。下面列出十进制数与8421码的对应关系。

根据这种对应关系,任何十进制数都可以同8421码进行转换。

如(52)10=(01010010)BCD;(1001 0100 1000 0101)BCD=(9485)10

(2)字符编码

在计算机系统中,除处理数字外,还需要把符号、文字等利用二进制数表示,这样的二进制数称为字符编码。

① 西文字符的编码

计算机中常用的西文字符编码有两种:EBCDIC码(Extended Binary-Coded Decimal Interchange Code,扩展二、十进制交换码)和ASCII码(American Standard Code for Information Interchange,美国信息交换标准码)。EBCDIC码是IBM公司为其大型计算机开发的8位字符编码,微型计算机则通常采用ASCII码。下面将主要介绍ASCII码。

ASCII码是目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的,它已被国际标准化组织(ISO)定为国际标准,称为ISO64标准,ASCII码有7位码和8位码两种形式,适用于所有拉丁文字母。

标准的ASCII码是7位码,占用1字节,最高位为0,编码表示的范围从00000000~01111111,即可以表示为27=128个字符。

扩展的ASCII码是8位码,也占用1字节,最高位为1,通常各个国家都将该扩展的部分作为自己国家语言文字的代码,其前128个码与标准的ASCII码是一样的,编码表示的范围从00000000~11111111,即可以表示28=256个字符。

每一个编码转换为十进制数的值被称为该字符的ASCII码值,如表1-3所示。

表1-3 ASCII对照表

一般来说,比较字符的大小就是比较字符ASCII码值的大小,从表中可见,控制符<数字<大写字母<小写字母。

② 汉字的编码

汉字在计算机中也采用二进制的数字化信息编码。由于汉字的数量大,常用的也有几千个之多,显然汉字编码比ASCII码表要复杂得多,用1字节(8 bit)是不够的。目前的汉字编码方案有2字节、3字节甚至4字节。在一个汉字处理系统中,输入、内部处理、输出对汉字的要求不同,所用代码也不尽相同。计算机处理时,汉字输入、存储、处理及输出过程所使用的代码均不相同,主要有汉字输入的输入码、机内存储和处理的机内码、用于显示及打印的字模点阵码(字形码)。由于不同过程使用的代码不同,汉字信息处理系统在处理汉字时,要进行输入码、机内码、字形码等一系列的汉字代码转换,具体转换过程如图1-2所示。

图1-2 汉字编码的转换过程

a. 输入码(外码)

由于汉字的数量大,键盘上的键位无法与每个汉字一一对应,要解决汉字与键盘的对应问题,就需要通过汉字输入码实现。

汉字输入码是指通过各种输入设备以不同方式将汉字输入计算机所使用的编码。每一种输入码都与相应的输入编码方案有关。根据不同的输入编码方案不同,一般可分为数字码、音码、字形码及音形码等。

• 数字码:直接用固定位数的数字给汉字编码,如区位码输入法、电报码输入法等。

• 音码:以汉语拼音字母和数字为汉字编码,如全拼输入法、双拼输入法、微软拼音输入法等。

• 字形码:根据汉字的字形结构对汉字进行编码,如五笔字型输入法、郑码输入法等。

• 音形码:以拼音为主,辅以字形、字义进行编码,如自然码输入法、智能ABC输入法等。

b. 机内码(内码)

为了将汉字的各种输入码在计算机内部统一起来,就有了专用于计算机内部存储汉字使用的机内码,用以将输入时使用的多种汉字输入码统一转换成机内码进行存储,以方便机内的汉字处理。目前,汉字内码有几种不同的编码方式,如简体的GB2312-80,繁体的BIG5、GB13000、Unicode等。

GB2312-80(交换码或国标码)是我国于1981年颁布的国家标准汉字编码集,即《信息交换用汉字编码字符集—基本集》。国标码中共有7445个字符符号,其中,非汉字符号为682个;汉字符号为6763个(包含一级汉字为3755个,二级汉字为3008个)。

国标码规定,每个汉字(包括非汉字的一些符号)由2字节代码表示。每个字节的最高位为0,只使用低7位,而低7位的编码中又有34个编码用于控制,这样每字节只有128-34=94个编码用于汉字。2字节就有94×94=8836个汉字编码,即所有的国标码汉字及符号组成一个94×94的方阵。在此方阵中,每一行称为一个“区”,每一列称为一个“位”,这个方阵实际上组成了一个有94个区(编号由01到94),每个区有94个位(编号由01到94)的汉字字符集。一个汉字所在的区号和位号的组合就构成了该汉字的“区位码”,其中,高两位为区号,低两位为位号。这样区位码可以唯一地确定某个汉字或字符;反之,任何一个汉字或符号都对应一个唯一的区位码,没有重码。

由于国标码的每字节也只用后7位,容易与ASCII码混淆。因此,计算机处理汉字时,并不直接使用国标码,而将最高位设置成1,变换成汉字的机内码,这样就可以与ASCII码区分开来了。当最高位是0时,表示为字符的ASCII码;当最高位是1时,表示为汉字码。

区位码与国标码之间的关系:国标码=区位码(十六进制)+2020H

例如,“大”字的区位码是2083,先分别将其区号、位号转换为十六进制,得1453H,再把区号和位号分别加上20H,得到“大”字的国标码为(1453)16+(2020)16=(3473)16

国标码与机内码之间的关系:机内码=国标码+8080H

例如,“中”字的国标码是5650H,其机内码为(5650)16+(8080)16=(D6D0)16

c. 字形码(输出码)

汉字的字形码是存放汉字字形信息的编码,它与汉字内码一一对应。每个汉字的字形码是预先存放在计算机内的,常称为汉字库。当输出汉字时,计算机根据内码在字库中查到其字形码,得知字形信息,然后就可以显示或打印输出了。

描述汉字字形的方法主要有点阵字形和轮廓字形两种。点阵字形法是用一个排列成方阵点的黑白来描述汉字的,其方法简单,但是放大后会出现锯齿现象。轮廓字形法是采用数学方法描述汉字的轮廓曲线,如中文Windows下采用的TrueType字库,其字形精度高,但输出前要经过复杂的数学运算。

汉字的字形点阵主要有16×16点阵、24×24点阵、32×32点阵、64×64点阵、96×96点阵、128×128点阵、256×256点阵等。一个汉字方块中行数、列数分得越多,描绘的汉字也就越精细,但占用的存储空间也就越多。汉字的字形点阵中每个点的信息要用一位二进制码来表示,如一个16×16点阵有256个点,就需要16×16÷8=32字节来存储。同理,24×24点阵的汉字输出码需要24×24÷8=72字节的存储空间。

汉字的字库是汉字字形数字化后,以二进制文件形式存储在存储器中而形成的汉字字模库。汉字字模库(汉字字形库,汉字库)中存储汉字字形信息的逻辑地址码称为汉字地址码。在汉字库中,字形信息都是按一定顺序连续存放在存储介质中的,所以汉字地址码也大多是连续有序的,而且与汉字的机内码间有着简单的对应关系,从而简化了汉字内码到汉字地址码的转换。