
2.1 数制及其转换
通过前面的学习,我们知道单片机是数字计算机的一个重要分支。学习单片机也离不开数字基础。
例如,单片机进行数据处理时只能使用二进制数据,编程和计算地址时需要用到十六进制数据,而人们在使用数据时往往习惯使用十进制数据,这就是数制问题。如何将三者有机统一,这就是数制之间的转换问题。
2.1.1 数制
十进制数有10个不同的数字符号:0、1、2、…、9,低位向高位进位的规律是“逢十进一”,“10”代表十进制数的10,记做10D。
二进制数有2个不同的数字符号:0和1,低位向高位进位的规律是“逢二进一”,“10”代表十进制数的2,记做10B。
十六进制数有16个不同的数字符号:0、1、2、…、9、A、B、C、D、E、F,低位向高位进位的规律是“逢十六进一”,“10”代表十进制数的16,记做10H。
任意一个十进制数N都可以表示成按权展开的多项式:

其中,di是0~9共10个数字中的任意一个,m是小数点右边的位数,n是小数点左边的位数,i是数位的序数。例如,543.21可表示为:
543.21=5 ×102 +4 ×101 +3 ×100 +2 ×10 -1 +1 ×10 -2
任意一个十六进制数N可以表示成按权展开的多项式:

其中,di是0~F共16个数字中的任意一个,m是小数点右边的位数,n是小数点左边的位数,i是数位的序数。例如,54E.21H可表示为:
54E.21H=5 ×162 +4 ×161 +14 ×160 +2 ×16 -1 +1 ×16 -2
任意一个二进制数N都可以表示成按权展开的多项式:

其中,di是0、1两个数字中的任意一个,m是小数点右边的位数,n是小数点左边的位数,i是数位的序数。例如,101.01B可表示为:
101.01B=1 ×22 +0 ×21 +1 ×20 +0 ×2 -1 +1 ×2 -2
一般而言,对于用R进制表示的数N,可以按权展开为:

式中,ai是0、1、…、(R-1)中的任意一个,m、n是正整数,R是基数。在R进制数中,每个数字所表示的值是该数字与它相应的权Ri的乘积,计数原则是“逢 R进一”。
2.1.2 数制之间的转换

首先,我们看看二进制数与十六进制数之间存在怎样的关系。
下面我们了解一下二进制数的计数方法:
0000(B)=0(H)
0001(B)=1(H)
0010(B)=2(H)
0011(B)=3(H)
0100(B)=4(H)
0101(B)=5(H)
0110(B)=6(H)
0111(B)=7(H)
1000(B)=8(H)
1001(B)=9(H)
1010(B)=A(H)
1011(B)=B(H)
1100(B)=C(H)
1101(B)=D(H)
1110(B)=E(H)
1111(B)=F(H)
其中,(B)代表二进制数,(H)代表十六进制数。
从中不难看出,4位二进制数刚好是一位十六进制数。
同一个数,用二进制表示需要8位,但用十六进制表示只需要2位。这就是我们引进十六进制数的理由。它使我们书写起来可以更简单。
计算机使用二进制数,我们书写时采用十六进制数。
实际上,n位二进制数可以表示2n种组合。
1位能表示21种组合(0、1),在计算机中称为位。
4位能表示24 =16 种组合(0 ~15 的整数,即1 位十六进制数),在计算机中称为半字节。
8位二进制能表示28 =256种组合(0 ~255的整数,即2位十六进制数),00H~FFH即为000D~255D共256个数字。8位二进制数在计算机中称为字节。
我们了解了二进制数和十六进制数的计数方法后,就不难看出它们之间的对应转换关系了。
2.1.3 非十进制数与十进制数转换
十进制数转换成非十进制数,转换时将整数部分与小数点部分分别转换。
整数部分采用除基数取余法,直至商为0,先得到的余数为低位,后得到的余数为高位。小数部分采用乘基数取整法,直至乘积为整数或达到控制精度为止。
【例2.1】 将十进制数168转换成二进制数和十六进制数。
解:整数采用除基数取余法。

所以,168D=10101000B;168D=A8H。
【例2.2】 将0.625D转换成二进制数和十六进制数
解:小数部分采用乘基数取整法,直至乘积为整数或达到控制精度为止。
转换为二进制数:乘2取整。
0.625 ×2=1.25取整数1,0.25 ×2=0.50取整数0,0.5 ×2=1取整数1。
所以,0.625D=0.101B。
转换为十六进制数:乘16取整。
0.625 ×16=10取整数A。
所以,0.625D=0.AH。
2.1.4 二进制数和十六进制数之间的转换
由于二进制数和十六进制数之间的特殊关系,可以采用分组法快速转换。将二进制数转换成十六进制数可按4位一组进行分组,每一组对应十六进制的相应数码,如表2.1所示,组合后即可得转换结果。分组时如果位数不够一组,整数部分在最左边补0,小数部分在最右边补0。
表2.1 十进制数与二进制数、十六进制数对应关系

将十六进制数转换成二进制数,只需将其每一位对应转换成二进制数的4位即可。
【例2.3】 将二进制数1011010.101B转换成十六进制数。

所以,1011010.101B=5A.AH。
【例2.4】 将十六进制数8E.38H转换成二进制数。

所以,8E.38H=10001110.00111B。