
1.4 单片机中的数制与码制
1.4.1 数制及其转换
常用的表达整数的数制有二进制数、十进制数、十六进制数3种,其中计算机处理的一切信号都是由二进制数表示的;人们日常用的是十进制数;十六进制数则用来缩写二进制数。3种数制之间可以相互转换。它们之间的关系见表1-2。为了区别十进制数、二进制数及十六进制数3种数制,在数的后面加一个字母以进行区别。用B表示二进制数;用D或不带字母表示十进制数;用H表示十六进制数。
表1-2 十进制、二进制、十六进制数对照表

1.二进制数和十进制数之间的相互转换
二进制转换成十进制,可采用展开求和法。即将二进制数按权展开再相加。
例如:

十进制转换成二进制可采用除2取余法。即用2不断地去除待转换的十进制数,直至商等于0为止,再将所得的各次余数依次倒序排列。

即43D=101011B。
2.二进制数和十六进制数之间的相互转换
二进制数转换为十六进制数,只需将二进制数从右向左每4位为一组分组,最后一组若不足4位,则在其左边添加0,以凑成4位,每组按表1-2用1位十六进制数表示。
例如:10011100100B→0100 1110 0100B=4E4H
十六进制数转换为二进制数,只需按表1-2用4位二进制数表示1位十六进制数。
例如:8DF3H=1000 1101 1111 0011B
1.4.2 有符号数的表示
数值在计算机中表示形式为机器数,由于计算机只能识别0和1,因此我们用来表示数值正负的“+”和“-”在计算机中也只能用“0”和“1”表示。一般在计算机中,对于正数,最高位规定为“0”;对于负数,最高位规定为“1”。
例如:

有符号数在计算机中有原码、反码和补码3种表示方法。
1.原码
用最高位表示数的正负,其余各位表示数的绝对值,这种表示方法称为原码表示法。
例如:

如果计算机的数据宽度为8,即字长为1字节,则原码能表示数值的范围为FFH~7FH(-127~-0,+0~+127),共256个。原码表示“0”时,可以有两种数值,即00000000B(+0)和10000000B(-0),这将会造成混乱,导致计算出错。
在计算机进行数值运算时一般不采用原码运算。
例如:在计算1-1=0时,为了简化计算机的硬件结构,把减法运算转换为加法运算,即采用1+(-1)去计算,会发现[1]原码+[-1]原码=00000001B+10000001B=10000010B=-2,即计算出错。
2.反码
正数的反码与原码相同;负数的反码为其原码的符号位不变,数值部分按位取反。
例如:[+5]反码=[+5]原码=00000101B=05H
[-5]反码=11111010B=FAH
如果计算机的数据宽度为8,即字长为1字节,则反码能表示数值的范围为80H~7FH(-127~-0,+0~+127),共256个。反码表示“0”时,可以有两种数值,即00000000B(+0)和11111111B(-0)两种数值。在数值运算中也易出错。
3.补码
正数的补码与原码相同;负数的补码为其反码加1,但符号位不变。
例如:[+5]补码=[+5]反码=[+5]原码=00000101B=05H
[-5]补码=[-5]反码+1=11111010B+1=11111011B=FBH
[+0]补码=[+0]原码=[+0]反码=00000000B=00H
在求-0的补码时,我们会发现[-0]原码=10000000B,[-0]反码=11111111B,加1后得100000000B,最高位产生了溢出,为了符合补码的定义和运算规则,将10000000B(80H)的补码真值定义为-128。也就是说,用补码表示“0”时,只有一种数值,即00000000B(+0)。补码的表示范围为80H~7FH(-128~+127),共256个。80H(10000000B)在计算机中表示最小的负整数,即-128,10000001~11111111依次表示-127~-1。在减法运算时,运用补码可以把减法运算转换为加法运算,运算结果是完全正确的。请读者熟记-128的补码是80H,0的补码是00H。
例如:计算1-1=0,用补码计算:(结果超过8位,最高位的“1”自然丢失),结果正确。
求负数的补码也可以用“模”来计算:[X]补码=模+X
“模”是计数系统的过程量回零值。如时钟以12为模,时钟从某一位置拨到另一位置总有两种拨法,即顺拨和逆拨。例如从6点拨到5点,可以逆拨,即6−1=5;也可以顺拨,即6+11=12(自动丢失)+5=5。这里11就是-1的补码,也就是说,运用补码可以把减法运算转化为加法运算。
计算机中8位二进制数的模为28=256=100H。例如[-5]补码=模+(-5)=100H-05H=FBH。
综上所述,可得出以下几个结论。
① 在计算机中,带符号数都是以补码的形式储存的,学习原码和反码的目的是为了更好地理解补码。
② 补码表示法能使符号位与有效值部分一起参加运算,从而简化运算规则。
③ 补码表示法能使减法运算转换为加法运算,简化计算机的硬件结构。
1.4.3 十进制数的编码——BCD码
人们在生活中习惯于使用十进制数,而计算机只能识别二进制数,为了让十进制数能被计算机识别,产生了BCD码(Binary Coded Decimal Code),即用二进制代码表示十进制数。例如计算器就采用 BCD 编码运算。这种编码的特点是保留十进制的权,数字则用二进制表示。即仍然是逢十进一,但又是一组二进制代码。
1.编码方法
BCD码有多种表示方法,最常用的BCD码为8421码,编码方式见表1-3。每4位二进制数表示一个十进制字符,这4位中各位的权依次是8、4、2、1,因此称为8421BCD码。
表1-3 8421BCD码与十进制数的对应关系

2.BCD码的运算
由于4位二进制数最多可以表示16种状态,余下的6种未用码(1010、1011、1100、1101、1110、1111),在BCD码中称为非法码或冗余码。从表1-3中可以看出,1位十进制数是逢十进位(借位)的,而4位二进制数是逢十六进位(借位)的,当计算结果有非法码或 BCD 码产生进位(借位)时,加法进行加6修正,减法进行减6修正。
例如:计算26+5=31,若用BCD码运算

需进行十进制修正

例如:计算27–9=18,若用BCD码运算

需进行十进制修正

需要指出的是,BCD码属于无符号数,其减法若出现被减数小于减数时,需向更高位借位,运算结果与十进制数不同。例如,十进制数:29−30=−1(有符号);BCD码:29−30=129−30=99(无符号)。
在单片机中,由专门的BCD码调整指令DA来完成BCD码的修正。
1.4.4 ASCII码
由于计算机只能处理二进制数,因此除了数值本身需要用二进制数形式表示外,另一些要处理的信息(如字母、标点符号、数字符号、文字符号等)也必须用二进制数表示,即在计算机中需将这些信息代码化,以便于计算机识别、存储及处理。
目前,在微机系统中,世界各国普遍采用美国信息交换标准码——ASCII码(American Standard Code for Information Interchange),见表1-4,用7位二进制数表示一个字符的ASCII码值。
表1-4 ASCII码编码表

注:①、②符号取决于使用这种代码的机器。其中①还可以表示“→”;②还可以表示“↑”。
由表1-4可知,7位二进制数能表达27=128个字符,其中包括数码(0~9)、英文大写字母(A~Z)、英文小写字母(a~z)、特殊符号(!,?,@,#等)和控制字(NUL,BS,CR,SUB等)。7位ASCII码分成两组:高3位一组,低4位一组,分别表示这些符号的列序和行序。
在计算机系统中,存储单元的长度通常为8位二进制数,为了存取方便,规定一个存储单元存放一个ASCII码,其中低7位为字母本身的编码,第8位往往用作奇偶校验位或规定为零。因此,也可以认为ASCII码的长度为8位。