2.1 数制与编码
数制是人们利用符号进行计数的科学方法。数制有很多种,在嵌入式系统中常使用的有二进制、十进制和十六进制。
数制所使用的数码的个数称为基,数制的每一位所具有的值称为权。
2.1.1 进位计数制
1.十进制计数制
十进制的基为10,即它所使用的数码为0~9,共10个数字。十进制各位的权是以10为底的幂,每个数因所处位置不同,其值是不同的,每一位数是其右边相邻那位数的10倍。
计数规律:逢10进1。
任意一个十进制数(S)10,可以表示为
(S)10=kn-110n-1+kn-210n-2+…+k0100+k-110-1+k-210-2+…+k-m-110-m-1
式中,ki是0~9中的任意一个数字,m、n是正整数,10是十进制的基数。
【例2.1】 (2001.9)10=2×103+0×102+0×101+1×100+9×10-1
十进制在书写中通常可省去下标,如2001.9即表示(2001.9)10。
十进制是日常生活中常用的数制,人机交互也常采用十进制。
2.二进制计数制
二进制的基为2,即它所使用的数码为0、1,共两个数字。二进制各位的权是以2为底的幂,每个数因所处位置不同,其值是不同的,每一位数是其右边相邻那位数的2倍。
计数规律:逢2进1。
任意一个二进制数(S)2可以表示成
(S)2=kn-12n-1+kn-22n-2+…+k020+k-12-1+k-22-2+…+k-m-12-m-1
式中,ki只能取0或1,m、n是正整数,2是二进制的基数。
【例2.2】 (1101.101)2=l×23+1×22+0×21+1×20+1×2-1+0×2-2+1×2-3
二进制数只有两个数码,即0和1,在电子计算机中容易实现。例如,可以用高电平表示1,低电平表示0,或者用晶体管截止时的输出表示1,导通时的输出表示0。所以,采用二进制就可以利用电路进行计数工作。二进制数的运算规则类似于十进制,加法为逢2进1,减法为借1为2。利用加法和减法就可以进行乘法、除法及其他数值运算。
由于二进制位数太长,不易记忆和书写,所以人们又提出了十六进制的书写形式。
3.十六进制计数制
十六进制的基为16,即它所使用的数码为0~9和A~F,共16个数字。十六进制各位的权是以16为底的幂,每个数因所处位置不同,其值是不同的,每一位数是其右边相邻那位数的16倍。
计数规律:逢16进1。
任意一个十六进制数(S)16可以表示成
(S)16=kn-116n-1+kn-216n-2+…+k0160+k-116-1+k-216-2+…+k-m-116-m-1
式中,ki可取0,1,2,…,9,A,B,C,D,E,F这16个数码和字母之一,用A~F表示10~15;m、n是正整数;16为十六进制的基数。
【例2.3】 (8AE6)16=8×163+A×162+E×161+6×160
十六进制数在书写中可使用另一种表示方式,如(8AE6)16可表示为8AE6H。
2.1.2 进位计数制的相互转换
人们习惯使用的是十进制数,计算机采用的是二进制数,人们书写时又多采用十六进制数,因此,必然产生各种进位计数制之间的相互转换问题。
1.十进制数转换成十六进制数
一个十进制整数转换成十六进制数时,按除16取余的方法进行。
【例2.4】
转换结果=(725)10=(2D5)16。
一个十进制小数转换成十六进制小数时,可按乘16取整的方法进行。
【例2.5】
转换结果=(0.7875)10=(0.C99)16。
注意:小数转换不一定能算尽,只需算到一定精度的位数即可,因此可能会产生一些误差,但当位数较多时,这个误差就很小了。
如果一个十进制数既有整数部分又有小数部分,可将整数部分和小数部分分别进行十六进制数的等值转换,然后合并即可得到结果。
2.十六进制数转换成十进制数
十六进制数转换成等值的十进制数时,可用按权相加的方法进行。
【例2.6】
(1C4.68)16=1×162+C×161+4×160+6×16-1+8×16-2=256+192+4+0.375+0.03125=(452.40625)10
3.十六进制数与二进制数的转换
一位十六进制数表示的数值恰好相当于4位二进制数表示的数值,因此彼此之间的转换极为方便,只要从小数点开始分别向左右展开即可。
【例2.7】
(3AB4)16=(0011101010110100)2
(11111101.01001111)2=(FD.4F)16
可见,在计算机中用十六进制书写要比用二进制书写简短,而且用十六进制表示的数据信息很容易转换成二进制表示。这就是普遍使用十六进制数的原因。
当十进制数转换成二进制数时,可采用十六进制数作为中间过渡。
2.1.3 数码和字符的代码表示
1.术语
数码:代表一个确切的数字,如二进制数、八进制数等。
代码:特定的二进制数码组,是不同信号的代号,不一定有数的意义。
编码:n位二进制数可以组合成2n个不同的信息,给每个信息规定一个具体码组,这个过程叫做编码。
2.二进制码
自然码:有权码,每位代码都有固定权值,结构形式与二进制数完全相同。
循环码:无权码,每位代码无固定权值,任何相邻的两个码组中,仅有一位代码不同。
自然二进制码和循环二进制码如表2.1所示。
表2.1 两种4位二进制编码
3.二-十进制码(BCD码)
BCD码是用二进制代码对十进制数进行编码,它既具有二进制码的形式(4位二进制码),又有十进制数的特点(每4位二进制码是1位十进制数)。BCD码有多种形式,单片机系统软件中常常用到8421BCD码,编码值与字符0~9的低4位码相同,易于实现人机交互。
【例2.8】
(1999)10=(0001100110011001)BCD
(0110100001000000)BCD=(6840)10
4.字母与字符的编码
嵌入式计算机系统不仅能够对数值数据进行处理,还能够对文本和其他非数值数据信息进行处理。计算机中这些非数值数据如字母、字符等都要用特定的二进制码表示。字母与字符用二进制码表示的方法很多,目前在计算机中普遍采用的是ASCII码(American Standard Code for Information Interchange,美国标准信息交换码)。常见的ASCII码,采用7位二进制数(00H~7FH)表示一个字符,包括10个十进制数码0~9,52个英文大、小写字母(A~Z,a~z),32个专用符号和32个控制符号,共计128个字符。在128个字符中有96个是可打印字符,32个是不可打印的字符。ASCII字符编码如表2.2所示。
表2.2 ASCII码字符表
在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),低7位(b6~b0)表示不同的字符代码,其最高位(b7)用做奇偶校验位。
除标准ASCII码外,有的公司通过使用字节最高位(b7)将ASCII码扩展到256个,增加80H~0FFH共128个字符,一般称为“扩充字符”,并非标准的ASCII码。