单片机原理及应用教程(第4版)
上QQ阅读APP看书,第一时间看更新

1.2 数制与编码

在计算机中,任何命令和信息都是以二进制数据的形式存储的。计算机所执行的全部操作都归结为对数据的处理和加工,为了便于理解计算机系统的基本工作原理,掌握数字、字母等字符在计算机系统中的表示方法及处理过程,本节主要介绍计算机中使用的数制和编码等方面的基础知识。

1.2.1 数制及其转换

数制就是计数方式。

日常生活中常用的是十进制计数方式,计算机内部使用的是二进制数据,在向计算机输入数据及输出数据时,人们惯于用十进制、十六进制数据等,因此,计算机在处理数据时,必须进行各种数制之间的相互转换。

1.二进制数

二进制数只有两个数字符号:0和1。计数时按“逢二进一”的原则进行计数,也称其基数为二。一般情况下,二进制数可表示为(110)2、(110.11)2、10110B等。

根据位权表示法,每一位二进制数在其不同位置表示不同的值。例如:

对于8位二进制数(低位~高位分别用D0~D7表示),则各位所对应的权值为

对于任何二进制数,可按位权求和展开为与之相应的十进制数。

(10)2=1×21+0×20=(2)10

(11)2=1×21+1×20=(3)10

(110)2=1×22+1×21+0×20=(6)10

(111)2=1×22+1×21+1×20=(7)10

(1111)2=1×23+1×22+1×21+1×20=(15)10

(10110)2=1×24+0×23+1×22+1×21+0×20=(22)10

例如,二进制数10110111,按位权展开求和计算可得:

(10110111)2=1×27+0×26+1×25+1×24+0×23+1×22+1×21+1×20

=128+0+32+16+0+4+2+1

=(183)10

对于含有小数的二进制数,小数点右边第一位小数开始向右各位的权值分别为

例如,二进制数10110.101,按位权展开求和计算可得:

(10110.101)2=1×24+1×22+1×21+1×2-1+0×2-2+1×2-3

=16+4+2+0.5+0.125

=(22.625)10

必须指出:在计算机中,一个二进制数(如8位、16位或32位)既可以表示数值,也可以表示一种符号的代码,还可以表示某种操作(即指令),计算机在程序运行时按程序的规则自动识别,这就是本节开始所提及的,即一切信息都是以二进制数据进行存储的。

2.十六进制数

十六进制数是学习和研究计算机中二进制数的一种比较方便的工具。计算机在信息输入/输出或书写相应程序或数据时,可采用简短的十六进制数表示相应的位数较长的二进制数。

十六进制数有16个数字符号,其中0~9与十进制相同,剩余6个为A~F,分别表示十进制数的10~15,见表1-1。十六进制数的计数原则是“逢十六进一”,也称其基数为十六,整数部分各位的权值由低位到高位分别为:160、161、162、163……

例如:(31)16=3×161+1×160=(49)10

(2AF)16=2×162+10×161+15×160=(687)10

为了便于区别不同进制的数据,一般情况下可在数据后面跟一个后缀。

● 二进制数用“B”表示(如00111010B)。

● 十六进制数用“H”表示(如3A5H)。

● 十进制数用“D”表示(如39D或39)。

3.不同数制之间的转换

前面已提及,计算机中的数只能用二进制表示,十六进制数适合读写方便的需要,日常生活中使用的是十进制数,计算机必须根据需要对各种进制数据进行转换。

(1)二进制数转换为十进制数

对任意二进制数均可按权值展开,将其转化为十进制数。

例如:10111B=1×24+0×23+1×22+1×21+1×20=23D

10111.011B=1×24+0×23+1×22+1×21+1×20+0×2-1+1×2-2+1×2-3

=23.375D

(2)十进制数转换为二进制数

1)方法1。十进制数转换为二进制数,可将整数部分和小数部分分别进行转换,然后合并。其中整数部分可采用“除2取余法”进行转换,小数部分可采用“乘2取整法”进行转换。

例如:采用“除2取余法”将37D转换为二进制数。

把所得余数由高到低排列起来可得:

37=100101B

例如:采用“乘2取整法”将0.625转换为二进制数小数。

把所得整数由高到低排列起来可得:

0.625=0.101B

同理,把37.625转换为二进制数,只需将以上转换合并起来可得:

37.625=100101.101B

2)方法2。可将十进制数与二进制位权从高位到低位进行比较,若十进制数大于或等于二进制某位,则该位取“1”,否则该位取“0”,采用按位分割法进行转换。

例如,将37.625转换为二进制数。

将整数部分37与二进制各位权值从高位到低位进行比较,37>32,则该位取1,剩余37-32=5,逐位比较,得00100101B。

将小数部分0.625按同样方法,得0.101B。

结果为37.625D=100101.101B。

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

在计算机进行输入、输出时,常采用十六进制数。十六进制是二进制数的简化表示。

因为24=16,所以4位二进制数相当于1位十六进制数,二进制、十进制、十六进制对应的转换关系见表1-1。

表1-1 二进制、十进制、十六进制转换表

(续)

在将二进制数转换为十六进制数时,其整数部分可由小数点开始向左每4位为一组进行分组,直至高位。若高位不足4位,则补0使其成为4位二进制数,然后按表1-1对应关系进行转换。其小数部分由小数点向右每4位为一组进行分组,不足4位则末位补0使其成为4位二进制数,然后按表1-1所示的对应关系进行转换。

例如:1000101B=0100 0101B=45H

10001010B=1000 1010B=8AH

100101.101B=0010 0101.1010B=25.AH

需要将十六进制数转换为二进制数时,则为上述方法的逆过程。

例如:45.AH=0100 0101.1010B

例如:

即7ABFH=111101010111111B

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

十进制数与十六进制数的相互转换可直接进行,也可先转换为二进制数,然后再把二进制数转换为十六进制数或十进制数。

例如,将十进制数37D转为十六进制数。

37D=100101B=00100101B=25H

例如,将十六进制数41H转换为十进制数。

41H=01000001B=65D

也可按位权展开求和方式将十六进制数直接转换为十进制数,这里不再详述。

1.2.2 编码

计算机通过输入设备(如键盘)输入信息和通过输出设备输出信息是多种形式的,既有数字(数值型数据),也有字符、字母、各种控制符号及汉字(非数值型数据)等。计算机内部所有数据均用二进制代码的形式表示,前面所提到的二进制数,没有涉及正、负符号问题,实际上是一种无符号数的表示,在实际问题中,有些数据确有正、负之分。为此,需要对常用的数据及符号等进行编码,以表示不同形式的信息。这种以编码形式所表示的信息既便于存储,也便于由输入设备输入信息、输出设备输出相应的信息。

1.二进制数的编码

(1)机器数与真值

一个数在计算机中的表示形式称为机器数,而这个数本身(含符号“+”或“-”)称为机器数的真值。

通常在机器数中,用最高位“1”表示负数,“0”表示正数(以下均以8位二进制数为例)。

例如,设两个数为N1、N2,其真值为

N1=105=+01101001B

N2=-105=-01101001B

则对应的机器数为

N1=0 1101001B(最高位“0”表示正数)

N2=1 1101001B(最高位“1”表示负数)

必须指出,对于一个有符号数,可因其编码不同而有不同的机器数表示法,如下面将要介绍的原码、反码和补码。

(2)原码、反码和补码

1)原码。按上所述,正数的符号位用“0”表示,负数的符号位用“1”表示,其数值部分随后表示,称为原码。

例如,仍以上面N1、N2为例,则

[N1]=0 1101001B

[N2]=1 1101001B

原码表示方法简单,便于与真值进行转换。但在进行减法时,为了把减法运算转换为加法运算(计算机结构决定了加法运算),必须引进反码和补码。

2)反码、补码。在计算机中,任何有符号数都是以补码形式存储的。对于正数,其反码、补码与原码相同。

例如,N1=+105则[N1]=[N1]=[N1]=0 1101001B。

对于负数,其反码为:原码的符号位不变,其数值部分按位取反。

例如,N2=-105则[N2]=1 1101001B,[N2]=1 0010110B。

负数的补码为:原码的符号位不变,其数值部分按位取反后再加1(即负数的反码+1),称为求补。

例如,N2=-105,则

[N2]=[N2]+1

=1 0010110B+1=1 0010111B

如果已知一个负数的补码,可以对该补码再进行求补码(即一个数补码的补码),即可得到该数的原码,即[[X]]=[X],而求出真值。

例如,已知[N2]=1 0010111B,则[N2]=11101000B+1=11101001B。

可得真值:N2=-105。

对采用补码形式表示的数据进行运算时,可以将减法转换为加法。

例如,设X=10,Y=20,求X-Y。

X-Y可表示为X+(-Y),即10+(-20)。

[X]=[X]=[X]=00001010B

[-Y]=10010100B

[-Y]=[-Y]+1=11101011B+1=11101100B

则有[X+(-Y)]=[X]+[-Y]

=00001010B+11101100B(按二进制相加)

=11110110B(和的补码)

再对[X+(-Y)]求补码可得[X+(-Y)],即

[X+(-Y)]=10001001B+1=10001010B

则X-Y的真值为-10D。

必须指出:所有负数在计算机中都是以补码形式存放的。对于8位二进制数,作为补码形式,它所表示的范围为-128~+127;而作为无符号数,它所表示的范围为0~255。对于16位二进制数,作为补码形式,它所表示的范围为-32 768~+32 767;而作为无符号数,它所表示的范围为0~65 536。因而,计算机中存储的任何一个数据,由于解释形式的不同,所代表的意义也不同,计算机在执行程序时自动进行识别。

例如,某计算机存储单元的数据为84H,其对应的二进制数表现形式为10000100B,该数若解释为无符号数编码,其真值为128+4=132;该数若解释为有符号数编码,最高位为1可确定为负数的补码表示,则该数的原码为11111011B+1B=11111100B,其真值为-124;该数若解释为BCD编码,其真值为84D(下面介绍);若该数作为8051单片机指令时,则表示一条除法操作(见附录A)。

2.二-十进制编码

二-十进制编码又称BCD编码。BCD编码既具有二进制数的形式,以便于存储;又具有十进制数的特点,以便于进行运算和显示结果。在BCD码中,用4位二进制代码表示1位十进制数。常用的8421BCD码的对应编码见表1-2。

表1-2 二-十进制编码(8421BCD码)

例如,将27转换为8421BCD码,即

27D=(0010 0111)8421BCD码

将105转换为8421BCD码,则

105D=(0001 0000 0101)8421BCD码

因为8421BCD码中只能表示0000B~1001B(0~9)这10个代码,不允许出现代码1010B~1111B(因其值大于9),因而,计算机在进行BCD加法(即二进制加法)过程中,若和的低四位大于9(即1001B)或低四位向高四位有进位时,为保证运算结果的正确性,低四位必须进行加6修正。同理,若和的高四位大于9(即1001B)或高四位向更高四位有进位时,为保证运算结果的正确性,高四位必须进行加6修正。

例如,17=(0001 0111)8421BCD

24=(0010 0100)8421BCD

17+24=41在计算机中的操作为

3.ASCII码

以上介绍的是计算机中的数值型数据的编码,对于计算机中非数值型数据,包括以下几种。

● 十进制数字符号:“0”,“1”,…,“9”(不是指数值)。

● 26个大小写英文字母。

● 键盘专用符号:“#”“$”“&”“+”“=”。

● 键盘控制符号:“CR”(回车)“DEL”等。

上述这些符号在由键盘输入时不能直接装入计算机,必须将其转换为特定的二进制代码(即将其编码),以二进制代码所表示的字符数据的形式装入计算机。

ASCII(American Standard Code for Information Interchange)码是一种国际标准信息交换码,它利用7位二进制代码来表示字符,再加上1位校验位,故在计算机中用1个字节即8位二进制数来表示一个字符,这样有利于对这些数据进行处理及传输。常用字符的ASCII码表示见表1-3。

表1-3 常用字符的ASCII码

(续)

ASCII(美国标准信息交换码)码见附录B。