1.2 微型计算机的数制及其转换
计算机最基本的功能是对“数据”进行运算处理。数据是计算机操作的对象,一般可分为数值数据和非数值数据。数值数据用于表示数量的大小,它有确定的数值;非数值数据没有确定的数值,它主要包括字符、汉字、逻辑数据等。数值数据的正负、大小、小数点如何表示为二进制形式,非数值数据如何表示为二进制形式,数据表示为二进制信息后,如何对数据进行运算,运算结果是否会溢出等一系列问题需要进行详细讨论。
1.2.1 微型计算机的数制
进位计数制是一种按进位进行计数的方法。在日常生活中,人们常使用各种进位计数制,如六十进制(1小时=60分,1分=60秒),十二进制(1英尺=12英寸,1年=12月等)。人们最熟悉且最习惯采用十进制来表示数据,而在计算机内部,数据则是用二进制表示的,因为二进制数运算简单,便于实现。但编写程序时,用二进制表示数据、地址时书写太长,易出错,因此数据又往往采用十进制、十六进制来表示。本节主要介绍十进制和二进制等常用的数制。
1.十进制(Decimal System)
数制最基本的特征是它的基数,基数是指数制中表示数值的数码个数。日常生活中,人们习惯使用十进制,它有10个数字符号,分别为0,1,2,3,4,5,6,7,8,9,因此十进制有10个数码,基数为“10“。它的计数规则是“逢十进一,借一当十”。
数的表示法一般采用位置计数法。每一个数码和数码所在位置载有该数大小的数值称为“权”。每个位置的“权”可以用基数的乘方表示。例如,数(53891)10可表示为:
按位权展开表示为:
53891=5×104+3×103+8×102+9×101+1×100
十进制小数的位权是以10的负次方幂表示的,如10–1=0.1,10–2=0.01。
因此,有n位整数和m位小数的十进制数D(Decimal number)用按位权展开表示为:
式中,di∈{0,1,…,9},m和n取正整数。
2.二进制(Binary System)
二进制的基为“2”,数字符号为0和1,其计算规则为“逢二进一,借一当二”。二进制各位的权是以2为底的幂,如数(10111)可表示为:
任意二进制数B(Binary number)按位权展开为:
式中,bi∈{0,1},m和n取正整数。
3.八进制(Octal System)
八进制的基为“8”,对应的数字符号共有8个:0,1,2,3,4,5,6,7,其计算规则为“逢八进一,借一当八”。八进制各位的权是以8为底的幂,八进制数按位权展开的计算方法同十进制和二进制,如数(362)8按位权展开为:
(362)8=3×82+6×81+1×80
4.十六进制(Hexadecimal System)
十六进制的基为“16”,对应的数字符号共有16个:0,1,2,…,9,A,B,C,D,E,F,其计算规则为“逢十六进一,借一当十六”。十六进制各位的权是以16为底的幂,十六进制数按权展开的计算方法同十进制和二进制,如数(362)16按位权展开为:
(362)16=3×162+6×161+1×160
各数制的数码对照表如表1-1所示。
表1-1 二进制、八进制、十进制、十六进制的数码对照表
在编写计算机程序时,数据可以用各种计数制来表示,为了区别不同的计数制,可以在数的右下角用数字标注该数的数制,例如,八进制数342.32可以写成(342.32)8。此外,还可以采用数据加后缀作标识:
D后缀表示十进制(Decimal),如3438D表示十进制数3468;
B后缀表示二进制(Binary),如01110101B表示二进制数01110101;
O后缀表示八进制(Octal),如2632O表示八进制数2632,由于O容易与0相混淆,所以通常用Q代替;
H后缀表示十六进制(Hexadecimal),如96A7BH表示十六进制数96A7B。
如果通过上下文可以理解所写的数是什么进位时,就不必附加数制符号。
1.2.2 微型计算机数制间的转换
人们习惯使用十进制,但计算机的算术运算和逻辑运算是以二进制为基础的运算,因此在解决问题时,需要把问题变成计算机能够“理解”的形式,这就需要把十进制数转换成二进制数。当计算机运算完毕时,又需要把获得的二进制数转换为十进制数,以适应人们的工作习惯。二进制数通常位数多,书写麻烦,而十六进制数易于书写,在编程时多为人们采用。在实际应用中,同一个数据在不同场合通常需要用不同的数制来表示,不同进制数在计算过程中完成相应转换,但转换前后两数应相等。
1.各类进制数转换为十进制数
转换方法:直接按位权展开,并求和。转换计算如式1-1所示。
式中 ai——系数,取值范围0~(r–1),i标明系数ai所在的位置;
r——r进制的基数。
例1 将二进制数111.11转换成十进制数,计算过程如下:
(111.11)2=1×22+1×21+1×20+1×2−1+1×2−2
=4+2+1+0.5+0.25
=(7.75)10
例2 将十六进制数61.B转换成十进制数,计算过程如下:
(61.B)16=6×161+1×160+B×16−1
=96+1+11×16−1
=(97.6875)10
2.十进制数转换为其他进制数
(1)十进制数转换为二进制数
十进制数通常分为整数部分和小数部分,转换时要分别进行计算。
整数部分的转换方法为“除2取余数,结果倒排序”,即将整数部分除以2,得到整数商和余数,对商再除以2,又得到商和余数,继续这一过程,直到商等于0为止,然后将所得的一系列余数按逆序排列,即得到整数部分对应的二进制数。
小数部分的转换方法为“乘2取整数,结果顺排列”,即将小数部分乘以2,乘积保留整数部分,再将所得乘积小数部分乘以2,再保留整数部分,继续这一过程,直到达到有效位数或小数部分等于零为止,然后将所得的整数部分按顺序排列,即得到小数部分对应的二进制数。
将整数部分和小数部分所得的二进制数合起来,便得到转换后的二进制数。在小数部分的转换过程中,乘积的小数部分常常不为零,二进制小数的位数可能很多,转换时根据精度要求,取一定的位数即可。
例3 将(41.495)10转换为二进制数。
解:①先将整数部分转换为二进制数,计算过程如下:
因此有(41)10=(101001)2。
②再将小数部分转换为二进制数,计算过程如下:
因此有(0.495)10=(0.0111)2。
综合起来,得
(41.495)10=(101001.0111)2
(3)十进制数转换为任意进制数
把十进制转换为任意进制数的方法和把十进制转换成二进制数相似,其整数部分采用除以基数取余数的方法,然后倒排序;其小数部分采用乘以基数得整数的方法,然后顺排序,最后再将其结果分别排列在一起即可。
例4 将十进制数(97.0664)10转换成十六进制数。
解:①先将整数部分转换为十六进制,计算过程如下:
因此有(97)10=(61)16。
②再将小数部分转换为十六进制数,计算过程如下:
因此有(0.0664)10=(0.10FF)16。
综合起来,得
(97.0664)10=(61.10FF)16
3.二进制数与八进制数、十六进制数之间的转换
由于23=8,24=16,所以每三位二进制数对应一位八进制数,每四位二进制数对应一位十六进制数,因此二进制数与八进制数、十六进制数可以通过表1-1之间的对应关系进行转换。
(1)二进制数与八进制数之间的转换
转换方法:以小数点为界线,分别向左或向右按三位二进制进行分组,不足三位的在前面或后面补足三位。参照表1-1,再将每一组二进制数转换为一位八进制数,排列后即为二进制数对应的八进制数。二进制数和八进制数之间的转换过程可逆。
例5 将二进制数11110.11转换成八进制数。转换过程如下:
因此有(11110.11)2=(36.6)8。
例6 将八进制数35.6转换成二进制数,转换过程如下:
因此有(35.6)8=(11101.11)2。
(2)二进制数与十六进制数之间的转换
转换方法:以小数点为界线,分别向左或向右按四位二进制进行分组,不足四位的在前面或后面补足四位。参照表1-1,再将每一组二进制数转换为一位十六进制数,排列后即为二进制数对应的十六进制数。二进制数和十六进制数之间的转换过程也可逆。
例7 将二进制数11011101111.0110101B转换为十六进制数,转换过程如下:
因此有11011101111.0110101B=(4EF.6A)16。
例8 将十六进制数EF.C转换成二进制数,转换过程如下:
因此有(EF.C)16=(11101111.11)2。
综上所述,不同进制数之间进行转换时需要注意以下几点:
①一个二进制数可以准确地转换为十进制数,而一个带小数的十进制数不一定能够准确地用二进制来表示;
②带小数的十进制数在转换为二进制数时,以小数点为分界,整数和小数要分别转换;
③二进制数与八进制数、十六进制数进行相互转换方便,且能准确地相互转换,但带小数的十进制数向八进制数或十六进制数转换时也存在精度问题;
④用十六进制数表示二进制数时长度较短,且应用在微机中时数据表达和编程方便,因此二进制数与十六进制数之间的转换必须十分熟悉。