大学信息技术教程
上QQ阅读APP看书,第一时间看更新

1.3 计算机中的数据及二进制

在计算机中,各种信息都是以数据的形式出现,对数据进行处理后产生的结果为信息,因此数据是计算机中信息的载体,数据本身没有意义,只有经过处理和描述,才能赋予其实际意义,如单独一个数据“32℃”并没有什么实际意义,但如果表示为“今天的气温是32℃”时,这条信息就有意义了。

计算机中处理的数据可分为数值数据和非数值数据(如字母、汉字和图形等)两大类,无论什么类型的数据,在计算机内部都是以二进制的形式存储和运算的。计算机在与外部交流时会采用人们熟悉和便于阅读的形式表示,如十进制数据、文字表达和图形显示等,这之间的转换则由计算机系统来完成。

在计算机内存储和运算数据时,通常要涉及的数据单位有以下3种。

(1)位(bit)。计算机中的数据都是以二进制来表示的,二进制的代码只有“0”“1”两个数码,采用多个数码(0和1的组合)来表示一个数,其中的每一个数码称为一位,位是计算机中最小的数据单位。

(2)字节(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(字节)

(3)字长。人们将计算机一次能够并行处理的二进制代码的位数,称为字长。字长是衡量计算机性能的一个重要指标。字长越长,数据所包含的位数越多,计算机的数据处理速度越快。计算机的字长通常是字节的整倍数,如8位、16位、32位、64位和128位等。

1.3.1 数制及其转换

数制是指用一组固定的符号和统一的规则来表示数值的方法。其中,按照进位方式计数的数制称为进位计数制。在日常生活中,人们习惯用的进位计数制是十进制,而计算机则使用二进制;除此以外,还包括八进制和十六进制等。二进制顾名思义,就是逢二进一的数字表示方法;以此类推,十进制就是逢十进一,八进制就是逢八进一等。

进位计数制中每个数码的数值不仅取决于数码本身,其数值的大小还取决于该数码在数中的位置,如十进制数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均可以展开表示为。

47417-00-017-1

上式中的Ki为第i位的系数,可以为0,1,2,…,R−1中的任何一个数,Ri表示第i位的权。如表1-2所示为计算机中常用的几种进位计数制的表示。

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

47417-00-017-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 常用数制对照关系表

47417-00-018-1

下面将具体介绍4种常用数制之间的转换方法。

1. 非十进制数转换为十进制数

将二进制数、八进制数和十六进制数转换十进制数时,只需用该数制的各位数乘以各自位权数,然后将乘积相加。用按权展开的方法即可得到对应的结果。

1-1】 将二进制数10110转换成十进制数。

先将二进制数10110按位权展开,再对其乘积相加,转换过程如下所示。

47417-00-018-2

1-2】 将八进制数232转换成十进制数。

先将八进制数232按位权展开,再对其乘积相加,转换过程如下所示。

47417-00-018-3

1-3】 将十六进制数232转换成十进制数。

先将十六进制数232按位权展开,再对其乘积相加,转换过程如下所示。

47417-00-018-4

2. 十进制数转换成其他进制数

将十进制数转换成二进制数、八进制数和十六进制数时,可将数字分成整数和小数分别转换,然后再拼接起来。

例如,将十进制数转换成二进制数时,整数部分采用“除2取余倒读”法,即将该十进制数除以2,得到一个商和余数(K0),再将商数除以2,又得到一个新的商和余数(K1),如此反复,直到商是0时得到余数(Kn-1),然后将得到的各次余数,以最后余数为最高位,最初余数为最低依次排列,即Kn-1K1K0,这就是该十进制数对应的二进制整数部分。

小数部分采用“乘2取整正读”法,即将十进制的小数乘2,取乘积中的整数部分作为相应二进制小数点后最高位K-1,取乘积中的小数部分反复乘2,逐次得到K-2K-3K-m,直到乘积的小数部分为0或位数达到所需的精确度要求为止,然后把每次乘积所得的整数部分由上而下(即从小数点自左往右)依次排列起来(K-1K-2K-m)即为所求的二进制数的小数部分。

同理,将十进制数转换成八进制数时,整数部分除8取余;小数部分乘8取整;将十进制数转换成十六进制数时,整数部分除16取余,小数部分乘16取整。

1-4】 将十进制数26.6875转换成二进制数。

用除2取余法进行整数部分转换,再用乘2取整法进行小数部分转换,具体转换过程如下所示。得到:

(26.6875)10 =(1010.1011)2

47417-00-019-1

3. 二进制数转换成八进制、十六进制数

二进制数转换成八进制数所采用的转换原则是“3位分一组”,即以小数点为界,整数部分从右向左每3位为一组,若最后一组不足3位,则在最高位前面添0补足3位,然后将每组中的二进制数按权相加得到对应的八进制数;小数部分从左向右每3位分为一组,最后一组不足3位时,尾部用0补足3位,然后按照顺序写出每组二进制数对应的八进制数即可。

1-5】 将二进制数1101001.101转换为八进制数。

转换过程如下所示。

47417-00-019-2

得到的结果为:(1101001.101)2 = (151.5)8

二进制数转换成十六进制数所采用的转换原则与上面的类似,采用的转换原则是“4位分一组”,即以小数点为界,整数部分从右向左、小数部分从左向右每4位一组,不足4位用0补齐即可。

1-6】 将二进制数101110011000111011转换为十六进制数。

转换过程如下所示。

47417-00-019-3

得到的结果为:(101110011000111011)2 = (2E63B)16

4. 八进制数、十六进制数转换成二进制数

八进制数转换成二进制数的转换原则是“一分为三”,即从八进制数的低位开始,将每一位上的八进制数写成对应的3位二进制数即可。如有小数部分,则从小数点开始,分别向左右两边按上述方法进行转换即可。

1-7】 将八进制数162.4转换为二进制数。

转换过程如下所示。

47417-00-020-1

得到的结果为:(162.4)8 = (001110010.100)2

十六进制数转换成二进制数的转换原则是“一分为四”,即把每一位上的十六进制数写成对应的4位二进制数即可。

1-8】 将十六进制数3B7D转换为二进制数。

转换过程如下所示。

47417-00-020-2

得到的结果为:(3B7D)16 = (0011101101111101)2

1.3.2 二进制数的运算

计算机内部采用二进制表示数据,其主要原因是电路容易实现、二进制运算法则简单、可以方便地利用逻辑代数分析和设计计算机的逻辑电路等。下面将对二进制的算术运算和逻辑运算进行简要介绍。

1. 二进制的算术运算

二进制的算术运算也就是通常所说的四则运算,包括加、减、乘、除,运算比较简单,其具体运算规则如下。

(1)加法运算。按“逢二进一”法,向高位进位,运算规则为:0+0=0、0+1=1、1+0=1、1+1=10。例如,(10011.01)2+(100011.11)2=(110111.00)2

(2)减法运算。减法实质上是加上一个负数,主要应用于补码运算,运算规则为:0−0=0、1−0=1、0−1=1(向高位借位,结果本位为1)、1−1=0。例如,(110011)2− (001101)2=(100110)2

(3)乘法运算。乘法运算与我们常见的十进制数对应的运算规则类似,规则为:0×0=0、1×0=0、0×1=0、1×1=1。例如,(1110)2×(1101)2= (10110110)2

(4)除法运算。除法运算也与十进制数对应的运算规则类似,规则为:0÷1=0、1÷1=1,而0÷0和1÷0是无意义的。例如,(1101.1)2 ÷ (110)2= (10.01)2

2. 二进制的逻辑运算

计算机所采用的二进制数1和0可以代表逻辑运算中的“真”与“假”“是”与“否”和“有”与“无”。二进制的逻辑运算包括“与”“或”“非”“异或”4种,具体介绍如下。

(1)“与”运算。“与”运算又称为逻辑乘,通常用符号“×”“∧”“·”来表示。其运算法则为:0∧0=0、0∧1=0、1∧0=0、1∧1=1。通过上述法则可以看出,当两个参与运算的数中有一个数为0时,其结果也为0,此时是没有意义的,只有当数中的数值都为1时,结果为1,即只有当所有的条件都符合时,逻辑结果才为肯定值。例如,假定某一个公益组织规定加入成员的条件是女性与慈善家,那么只有既是女性又是慈善家的人才能加入该组织。

(2)“或”运算。“或”运算又称为逻辑加,通常用符号“+”或“∨”来表示。其运算法则为:0∨0=0、0∨1=0、1∨0=1、1∨1=1。该法规表明只要有一个数为1,则结果就是1,例如,假定某一个公益组织规定加入成员的条件是女性或慈善家,那么只要符合其中任意一个条件或两个条件都可以加入该组织。

(3)“非”运算。“非”运算又称为逻辑否运算,通常是在逻辑变量上加上划线来表示,如变量为A,则其非运算结果用Ā表示。其运算法则为:47417-00-021-1。例如,假定A变量表示男性,Ā就表示非男性,即指女性。

(4)“异或”运算。“异或”运算通常用符号“⊕”表示,其运算法则为:0⊕0=0、0⊕1=1、1⊕0=1、1⊕1=0。该法规表明,当逻辑运算中变量的值不同时,结果为1,而变量的值相同时,结果为0。

1.3.3 数的编码表示

一般的数都有正负之分,计算机只能记忆0和1,为了将数在计算机中存放和处理就要将数的符号进行编码。基本方法是在数中增加一位符号位(一般将其安排在数的最高位之前),并用“0”表示数的正号,用“1”表示数的负号,例如:

数+1110011在计算机中可存为01110011;

数−1110011在计算机中可存为11110011。

这种数值位部分不变,仅用0和1表示其符号得到的数的编码,称为原码,并将原来的数称为真值,将其编码形式称为机器数。

按上述原码的定义和编码方法,数0就有两种编码形式:0000…0和100…0。所以对于带符号的整数来说,n位二进制原码表示的数值范围是:

−(2n−1−1)~+(2n−1−1)

例如,8位原码的表示范围为:−127~+127,16位原码的表示范围为−32767~+32767。

用原码作乘法,计算机的控制较为简单,两符号位单独相乘就得结果的符号位,数值部分相乘就得结果的数值。但用其做加减法就较为困难,主要难在结果符号的判定,并且实际进行加法还是进行减法操作还要依据操作对象具体判定。为了简化运算操作,把加法和减法统一起来以简化运算器的设计,计算机中也用到了其他的编码形式,主要有补码和反码。

下面仅给出求补码和反码的算法和应用举例。

(1)求反码的算法

对于正数,其反码和原码同形;对于负数,则将其原码的符号位保持不变,而将其他位按位求反(即将0换为1,将1换为0)。

(2)求补码的算法

对于正数,其补码和原码同形;对于负数,先求其反码,再在最低位加“1”(称为末位加1)。

求原码、反码和补码的计算,举例如表1-4所示(以8位代码为例)。

若对一补码再次求补就又得到了对应的原码。

表1-4 真值、原码、反码、补码对照举例

47417-00-021-2

注:在二进制数的小数取舍中,0舍1入。(0.82)10=(0.110100011…)2,取8位小数,就把第9位上的1入到第8位,而第8位进位,从而得到十进制数0.82的二进制数是0.11010010。在原码中,为了凑8位数字,把最后一个0舍去。−0.6的转换类似。