
2.2 机 器 数
数的原值称为真值,是计算机中表示数的实际数值。
数在计算机中的二进制表示形式称为机器数。
机器数可以用不同的码制表示,常用的有原码、反码和补码3种,广泛使用的是原码和补码两种。
在本书中为了便于理解,常将数用中括号括起来,在尾部加注下标“原”、“反”或“补”来明确码制。
机器数将数的符号也进行了数字化,一般用最高位表示数的符号,“0”代表正数,“1”代表负数。
机器数的表示形式还与存储位数有关。也就是说,数据在计算机中的存储方式是以一个字节(8位二进制数)作为一个基本存储单元的,超出8位二进制数的数则需要2个字节、3个字节、4个字节,甚至更多。最常用的是单字节、双字节和四字节。
【例2.5】 数+1010B,相应原码为00001010B(以单字节表示)。
数-1010B,相应原码为10001010B(以单字节表示)。
数+100000010B,相应原码为0000000100000010B(以双字节表示)。
数-100000010B,相应原码为1000000100000010B(以双字节表示)。
原码的形式值不一定等于真值,但与真值肯定存在某种对应关系。
也就是说,无符号数(可理解为单纯的正数)的原码等于真值。
2.2.1 原码
将数的真值的符号数字化称为原码。
【例2.6】 X=-110101B,则【X】原=10110101。
通过上面的例题不难看出,在原码表示中,最高位为符号位,其他位表示数的绝对值。
n位原码表示的数的范围为[ -(2n-1 -1),+2n-1 -1]。8 位原码表示的数的范围是[ -127,127],16位原码表示的数的范围是[ -32 767,32 767]。
原码表示数简单直观,做乘除运算比较方便,可取绝对值直接运算,而符号单独处理。但对于应用得最多的加减运算,原码表示则不太方便,像(-2)+3表面上做加法操作,而实际上做(3-2)减法操作。
为此,需要引进反码和补码的概念。
2.2.2 反码
对于负数而言,将原码除符号位以外的其他各位按位求反的所得即为反码。
【例2.7】 设X=-101011,那么【X】原=10101011,则【X】反=11010100。
正数的反码与原码相同,负数的反码等于其原码(除符号位)按位取反。
反码表示数的范围与原码相同。
2.2.3 补码
负数的补码是其原码的符号位不变,其他位按位求反后末位加1(即反码加1)。
【例2.8】 设X=-101011,那么【X】原=10101011B,则【X】反=11010100B。
按照补码定义【X】补=11010101B。
如前所述,得出以下结论。
●正数的原码=反码=补码,或者说正数没有反码和补码。
●负数的反码=原码除符号位以外的其他各位按位求反,负数的补码=反码+1。
8位二进制数的原码、反码和补码可以直接查表获取,如表2.2所示。
表2.2 8位二进制数的原码、反码和补码对照表

2.2.4 无符号数
在某些情况下,要处理的数据全是正数,此时保留符号位毫无意义。若将符号位也作为数据位处理,可形成无符号数。
【例2.9】 10011001B,表示无符号整数是1 ×27 +1 ×24 +1 ×23 +1,即153。
表示有符号整数是-(1 ×24 +1 ×23 +1),即-25。
n位无符号整数的范围为[0,2n-1],8位(一字节)无符号整数的范围为[0,255],16位(两个字节)无符号整数的范围为[0,65 535]。
由此可见,在相同位数的情况下,无符号数比有符号数所表示的数的范围更大。
在计算机中,用无符号数表示存储空间的地址。
2.2.5 BCD码
BCD码(BinaryCoded Decimal)使用4位二进制数来表示一位十进制数,常称为二进制编码的十进制数。
4位二进制数能表示16种状态,可用其中任意10种状态表示十进制数字0~9,由此形成8421码、2421码、余3码等多种BCD码,最常用的是8421码。
8421码的编码方法如表2.3所示,8421是指用于编码的4位二进制数各位的权,这是计算机中最常用的编码方法。由此也不难推出2421码的编码方法。
表2.3 8421码编码表

【例2.10】 1329D用BCD码表示为0001 0011 0010 1001B。
67 536D用BCD码表示为0110 0111 0101 0011 0110B。
BCD码的使用为十进制数在计算机内的表示提供了一种简单的手段,计算机提供了直接处理BCD码的一组指令,但BCD码参与运算有许多麻烦,这些指令在实际编程时很少使用。
十进制数的BCD码表示并不是十进制数通过数制转换形成的二进制数。
BCD码有压缩BCD码和非压缩BCD码两种不同的存储方式。压缩BCD码用1字节存放两个十进制数字,每个十进制数字占4位,一个十进制数字占低4位,另一个十进制数字占高4位;而非压缩BCD码用1字节存放1个十进制数字,每个十进制数字占每字节的低4位,高4位一般为0。
【例2.11】 9329D用压缩BCD码表示为1001 0011 0010 1001B。
9329D用非压缩BCD码表示为00001001 00000011 00000010 00001001B。
非压缩BCD码存放需4字节,压缩BCD码存放只需2字节。
2.2.6 字符数据编码
字符数据包括字母、数字、专用字符及一些控制字符。字符数据的使用方便了人和计算机交换信息,美国信息交换标准代码 ASCII码(American Standard CodeInformation Interchange)是最主要的字符编码方式。
ASCII码采用1字节的低7位进行编码,能表示128个字符。最高位用做奇偶校验位。
如表2.4所示为用十六进制形式给出的主要字符的ASCII码。数字0 ~9的ASCII码为30H~39H,大写字母 A~Z的 ASCII码为 41H~5AH,小写字母 a~z的 ASCII码为61H~7AH,控制字符的ASCII码为00H~1FH及7FH,专用字符的ASCII码散列其中。
表2.4 主要字符十六进制ASCII码表

ASCII码的主要用途是在数据通信时方便传输,比如说我们在传送“0”时,实际传送的是ASCII码“30H”。
2.2.7 内存中的数据
数据在计算机内部采用何种方式表示,依赖于程序执行的情况,可用二进制、BCD码与字符方式,但最终总是采用二进制方式存储。计算机在输入、输出及存储时采用编码方式,因此在运算过程的前后进行“码值”与“值码”的转换是必不可少的,如ASCII码转换成数值或数值转换成ASCII码。
【例2.12】 无符号整数2 009以二进制数方式、压缩BCD码方式、非压缩BCD码方式和ASCII码方式表示,分别需要11位、16位、32位和32位存储。
即:

数据的存储是以数据长度为单位,按字节顺序存放的。数据的低位放低字节地址,数据的高位放高字节地址。简而言之,低位低地址,高位高地址。
无符号整数常用字节(8位)、字(16位)、双字(32位)表示。如果实际数据的位数少,对数据位数要进行扩展,一般是在高位前补0。
例如,2 006的二进制数为11111011001B,11位二进制数用1字节(8位)存放不下,必须以字(16位)存放,高5位补0便是00000111 11011001B,并且要将11011001B放在低地址,00000111B放在高地址。
综上所述,对于以上各种数据的理解,是学好单片机软件的基础,读者务必学懂、弄通,以加深理解。