任务二 了解计算机中信息的表示和存储
任务要求
肖磊知道利用计算机技术可以采集、存储和处理各种用户信息,也可将这些用户信息转换成用户可以识别的文字、声音或音视频进行输出,然而让肖磊疑惑的是,这些信息在计算机内部又是如何表示的呢?该如何对信息进行量化呢?肖磊认为,学习好这方面的知识,才能更好地使用计算机。
本任务要求认识计算机中的数据及其单位,了解数制及其转换,认识二进制数的运算,并了解计算机中字符的编码规则。
任务实现
(一)认识计算机中的数据及其单位
在计算机中,各种信息都是以数据的形式出现的,对数据进行处理后产生的结果为信息,因此数据是计算机中信息的载体,数据本身没有意义,只有经过处理和描述,才能赋予其实际意义,如单独一个数据“32℃”并没有什么实际意义,但如果表示为“今天的气温是32℃”时,这条信息就有意义了。
计算机中处理的数据可分为数值数据和非数值数据(如字母、汉字和图形等)两大类,无论什么类型的数据,在计算机内部都是以二进制的形式存储和运算的。计算机在与外部交流时会采用人们熟悉和便于阅读的形式表示,如十进制数据、文字表达和图形显示等,这之间的转换则由计算机系统来完成。
在计算机内存储和运算数据时,通常要涉及的数据单位有以下3种。
• 位(bit)。计算机中的数据都是以二进制来表示的,二进制的代码只有“0”“1”两个数码,采用多个数码(0和1的组合)来表示一个数,其中的每一个数码称为一位,位是计算机中最小的数据单位。
• 字节(Byte)。在对二进制数据进行存储时,以8位二进制代码为一个单元存放在一起,称为一个字节,即1 Byte =8 bit。字节是计算机中信息组织和存储的基本单位,也是计算机体系结构的基本单位。在计算机中,通常用B(字节)、KB(千字节)、MB(兆字节)或GB(吉字节)为单位来表示存储器(如内存、硬盘和U盘等)的存储容量或文件的大小。所谓存储容量指存储器中能够包含的字节数,存储单位B、KB、MB、GB和TB的换算关系如下。
1 KB(千字节)=1 024 B(字节)=210B(字节)
1 MB(兆字节)=1 024 KB(千字节)=220B(字节)
1 GB(吉字节)=1 024 MB(兆字节)=230B(字节)
1 TB(太字节)=1 024 GB(吉字节)=240B(字节)
• 字长。人们将计算机一次能够并行处理的二进制代码的位数,称为字长。字长是衡量计算机性能的一个重要指标,字长越长,数据所包含的位数越多,计算机的数据处理速度越快。计算机的字长通常是字节的整倍数,如8位、16位、32位、64位和128位等。
(二)了解数制及其转换
数制是指用一组固定的符号和统一的规则来表示数值的方法。其中,按照进位方式计数的数制称为进位计数制。在日常生活中,人们习惯用的进位计数制是十进制,而计算机则使用二进制;除此以外,还包括八进制和十六进制等。顾名思义,二进制就是逢二进一的数字表示方法;依次类推,十进制就是逢十进一,八进制就是逢八进一等。
进位计数制中每个数码的数值不仅取决于数码本身,其数值的大小还取决于该数码在数中的位置,如十进制数828.41,整数部分的第1个数码“8”处在百位,表示800,第2个数码“2”处在十位,表示20,第3个数码“8”处在个位,表示8,小数点后第1个数码“4”处在十分位,表示0.4,小数点后第2个数码“1”处在百分位,表示0.01。也就是说,同一数码处在不同位置所代表的数值是不同的,数码在一个数中的位置称为数制的数位;数制中数码的个数称为数制的基数,十进制数有0、1、2、3、4、5、6、7、8、9共10个数码,其基数为10;在每个数位上的数码符号所代表的数值等于该数位上的数码乘以一个固定值,该固定值称为数制的位权数,数码所在的数位不同,其位权数也有所不同。
无论在何种进位计数制中,数值都可写成按位权展开的形式,如十进制数828.41可写成:
828.41=8×100+2×10+8×1+4×0.1+1×0.01
或者:
828.41=8×102+2×101+8×100+4×10-1+1×10-2
上式为数值按位权展开的表达式,其中10i称为十进制数的位权数,其基数为10,使用不同的基数,便可得到不同的进位计数制。设R表示基数,则称为R进制,使用R个基本的数码,Ri就是位权,其加法运算规则是“逢R进一”,则任意一个R进制数D均可以展开表示为
上式中的Ki为第i位的系数,可以为0,1,2,…,R-1中的任何一个数,Ri表示第i位的权。表1-2所示为计算机中常用的几种进位计数制的表示。
表1-2 计算机中常用的几种进位计数制的表示
通过表1-2可知,对于数据4A9E,从使用的数码可以判断出其为十六进制数,而对于数据492来说,如何判断属于哪种数制呢?在计算机中,为了区分不同进制的数,可以用括号加数制基数下标的方式来表示不同数制的数,例如,(492)10表示十进制数,(1001.1)2表示二进制数,(4A9E)16表示十六进制数,也可以用带有字母的形式分别表示为(492)D、(1001.1)B和(4A9E)H。在程序设计中,为了区分不同进制数,常在数字后直接加英文字母后缀来区别,如492D、1001.1B等。
表1-3所示为上述几种常用数制的对照关系表。
表1-3 常用数制对照关系表
提示
通过表1-3可以看出,采用不同的数制表示同一个数时,基数越大,则使用的位数越少,如十进数12,需要4位二进制数来表示,需要2位八进制数来表示,只需1位十六制数来表示。所以,在一些C语言的程序中,常采用八进制和十六进制来表示数据。
下面将具体介绍4种常用数制之间的转换方法。
1. 非十进制数转换为十进制数
将二进制数、八进制数和十六进制数转换成十进制数时,只需用该数制的各位数乘以各自对应的位权数,然后将乘积相加。用按位权展开的方法即可得到对应的结果。
【例1-1】将二进制数10110转换成十进制数。
先将二进制数10110按位权展开,然后将乘积相加,转换过程如下所示。
(10110)2=(1×24+0×23+1×22+1×21+0×20)10=(16+4+2)10=(22)10
【例1-2】将八进制数232转换成十进制数。
先将八进制数232按位权展开,然后将乘积相加,转换过程如下所示。
(232)8=(2×82+3×81+2×80)10=(128+24+2)10=(154)10
【例1-3】将十六进制数232转换成十进制数。
先将十六进制数232按位权展开,然后将乘积相加,转换过程如下所示。
(232)16=(2×162+3×161+2×160)10=(512+48+2)10=(562)10
2. 十进制数转换成其他进制数
将十进制数转换成二进制数、八进制数和十六进制数时,可先将数值分成整数和小数分别转换,再拼接起来。
例如,将十进制数转换成二进制数时,整数部分采用“除2取余倒读”法,即将该十进制数除以2,得到一个商和余数(K0),再将商数除以2,又得到一个新的商和余数(K1),如此反复,直到商为0时得到余数(Kn-1),然后将得到的各次余数,以最后余数为最高位,最初余数为最低位依次排列,即Kn-1…K1K0,这就是该十进制数对应的二进制整数部分。
小数部分采用“乘2取整正读”法,即将十进制的小数乘2,取乘积中的整数部分作为相应二进制小数点后最高位K-1,取乘积中的小数部分反复乘2,逐次得到K-2 K-3…K-m,直到乘积的小数部分为0或位数达到所需的精确度要求为止,然后把每次乘积所得的整数部分由上而下(即从小数点自左往右)依次排列起来(K-1 K-2…K-m)即为所求的二进制数的小数部分。
同理,将十进制数转换成八进制数时,整数部分除8取余;小数部分乘8取整;将十进制数转换成十六进制数时,整数部分除16取余,小数部分乘16取整。
提示
在进行小数部分的转换时,有些十进制小数不能转换为有限位的二进制小数,此时只有用近似值表示。例如,(0.57)10不能用有限位二进制表示,如果要求5位小数近似值,则得到(0.57)10≈(0.10010)2。
【例1-4】将十进制数225.625转换成二进制数。
用除2取余法进行整数部分转换,再用乘2取整法进行小数部分转换,具体转换过程如下所示。
(225.625)10=(11100001.101)2
3. 二进制数转换成八进制数、十六进制数
二进制数转换成八进制数所采用的转换原则是“3位分一组”,即以小数点为界,整数部分从右向左每3位为一组,若最后一组不足3位,则在最高位前面添0补足3位,然后将每组中的二进制数按权相加得到对应的八进制数;小数部分从左向右每3位分为一组,最后一组不足3位时,尾部用0补足3位,然后按照顺序写出每组二进制数对应的八进制数即可。
【例1-5】将二进制数1101001.101转换为八进制数。
转换过程如下所示。
得到的结果为(1101001.101)2=(151.5)8
二进制数转换成十六进制数所采用的转换原则与上面的类似,采用的转换原则是“4位分一组”,即以小数点为界,整数部分从右向左、小数部分从左向右每4位一组,不足4位用0补齐即可。
【例1-6】将二进制数101110011000111011转换为十六进制数。
转换过程如下所示。
得到的结果为(101110011000111011)2=(2E63B)16
4. 八进制数、十六进制数转换成二进制数
八进制数转换成二进制数的转换原则是“一分为三”,即从八进制数的低位开始,将每一位上的八进制数写成对应的3位二进制数即可。如果有小数部分,则从小数点开始,分别向左右两边按上述方法进行转换即可。
【例1-7】将八进制数162.4转换为二进制数。
转换过程如下所示。
得到的结果为(162.4)8=(001110010.100)2
十六进制数转换成二进制数的转换原则是“一分为四”,即把每一位上的十六进制数写成对应的4位二进制数即可。
【例1-8】将十六进制数3B7D转换为二进制数。
转换过程如下所示。
得到的结果为(3B7D)16=(0011101101111101)2
(三)认识二进制数的运算
计算机内部采用二进制表示数据,其主要原因是技术实现简单、易于进行转换、二进制运算规则简单、可以方便地利用逻辑代数分析和设计计算机的逻辑电路等。下面将对二进制的算术运算和逻辑运算进行简要介绍。
1. 二进制的算术运算
二进制的算术运算也就是通常所说的四则运算,包括加、减、乘和除,运算比较简单,其具体运算规则如下。
• 加法运算。按“逢二进一”法,向高位进位,运算规则为0+0=0、0+1=1、1+0=1、1+1=10。例如,(10011.01)2+(100011.11)2=(110111.00)2。
• 减法运算。减法实质上是加上一个负数,主要应用于补码运算,运算规则为0-0=0、1-0=1、0-1=1(向高位借位,结果本位为1)、1-1=0。例如,(110011)2-(001101)2=(100110)2。
• 乘法运算。乘法运算与我们常见的十进制数对应的运算规则类似,运算规则为0×0=0、1×0=0、0×1=0、1×1=1。例如,(1110)2×(1101)2=(10110110)2。
• 除法运算。除法运算也与十进制数对应的运算规则类似,运算规则为0÷1=0、1÷1=1,而0÷0和1÷0是无意义的。例如,(1101.1)2÷(110)2=(10.01)2。
2. 二进制的逻辑运算
计算机所采用的二进制数1和0可以代表逻辑运算中的“真”与“假”、“是”与“否”和“有”与“无”。二进制的逻辑运算包括“与”“或”“非”和“异或”4种,具体介绍如下。
• “与”运算。“与”运算又称为逻辑乘,通常用符号“×”“∧”和“·”来表示。其运算规则为0∧0=0、0∧1=0、1∧0=0、1∧1=1。通过上述运算规则可以看出,当两个参与运算的数中有一个数为0时,其结果也为0,此时是没有意义的,只有当数中的数值都为1时,结果为1,即只有当所有的条件都符合时,逻辑结果才为肯定值。例如,假定某一个公益组织规定加入成员的条件是女性与慈善家,那么只有既是女性又是慈善家的人才能加入该组织。
• “或”运算。“或”运算又称为逻辑加,通常用符号“+”或“∨”来表示。其运算法则为0∨0=0、0∨1=1、1∨0=1、1∨1=1。该运算规则表明只要有一个数为1,则结果就是1。例如,假定某一个公益组织规定加入成员的条件是女性或慈善家,那么只要符合其中任意一个条件或两个条件都可以加入该组织。
• “非”运算。“非”运算又称为逻辑否运算,通常是在逻辑变量上加上画线来表示,如变量为A,则其非运算结果用Ā表示。其运算规则为。例如,假定A变量表示男性,Ā就表示非男性,即指女性。
• “异或”运算。“异或”运算通常用符号“⊕”表示,其运算规则为0⊕0=0、0⊕1=1、1⊕0=1、1⊕1=0。该运算规则表明,当逻辑运算中变量的值不同时,结果为1,而变量的值相同时,结果为0。
(四)了解计算机中字符的编码规则
编码就是利用计算机中的0和1两个代码的不同长度表示不同信息的一种约定方式。由于计算机是以二进制的形式存储和处理数据的,因此只能识别二进制编码信息,对于数字、字母、符号、汉字、语音和图形等非数值信息都要用特定规则进行二进制编码才能进入计算机。对于西文与中文字符,由于形式的不同,使用的编码也不同。
1. 西文字符的编码
计算机对字符进行编码,通常采用ASCII和Unicode两种编码。
• ASCII。美国信息交换标准代码(American Standard Code for Information Interchange,ASCII)是基于拉丁字母的一套编码系统,主要用于显示现代英语和其他西欧语言,它被国际标准化组织指定为国际标准(ISO 646标准)。ASCII是使用7位二进制数来表示所有的大写和小写字母、数字0~9、标点符号,以及在美式英语中使用的特殊控制字符,共有27=128个不同的编码值,可以表示128个不同字符的编码,如表1-4所示。其中,低4位编码b3b2b1b0用作行编码,而高3位b6b5b4用作列编码,其中包括95个编码对应计算机键盘上的符号或其他可显示或打印的字符,另外33个编码被用作控制码,用于控制计算机某些外部设备的工作特性和某些计算机软件的运行情况。例如,字母A的编码为二进制数1000001,对应十进制数65或十六进制数41。
表1-4 标准7位ASCII
• Unicode。Unicode也是一种国际标准编码,采用两个字节编码,能够表示世界上所有的书写语言中可能用于计算机通信的文字和其他符号。目前,Unicode在网络、Windows操作系统和大型软件中得到应用。
2. 汉字的编码
在计算机中,汉字信息的传播和交换必须有统一的编码才不会造成混乱和差错。因此计算机中处理的汉字是指包含在国家或国际组织制定的汉字字符集中的汉字,常用的汉字字符集包括GB2312、GB18030、GBK和CJK编码等。为了使每个汉字有一个全国统一的代码,我国颁布了汉字编码的国家标准,即GB2312-80《信息交换用汉字编码字符集》基本集,这个字符集是目前国内所有汉字系统的统一标准。
汉字的编码方式主要有以下4种。
• 输入码。输入码也称外码,是指为了将汉字输入计算机而设计的代码,包括音码、形码和音形码等。
• 区位码。将GB2312字符集放置在一个94行(每一行称为“区”)、94列(每一列称为“位”)的方阵中,方阵中的每个汉字所对应的区号和位号组合起来就得到了该汉字的区位码。区位码用4位数字编码,前两位叫作区码,后两位叫作位码,如汉字“中”的区位码为5448。
• 国标码。国标码采用两个字节表示一个汉字,将汉字区位码中的十进制区号和位号分别转换成十六制数,再分别加上20H,就可以得到该汉字的国际码。例如,“中”字的区位码为5448,区号54对应的十六进转数为36,加上20H,即为56H,而位号48对应的十六进制数为30,加上20H,即为50H,所以“中”字的国标码为5650H。
• 机内码。在计算机内部进行存储与处理所使用的代码,称为机内码。对汉字系统来说,汉字机内码规定在汉字国标码的基础上,每字节的最高位置为1,每字节的低7位为汉字信息。将国标码的两个字节编码分别加上80H(即10000000B),便可以得到机内码,如汉字“中”的机内码为D6D0H。