在平常的算术运算中,用“+”表示正数,用“-”表示负数;而在数字系统中,正﹑负数的表示方法是:把一串二进制数的最高位作为符号位,在这个符号位上用0表示正数,用1表示负数。一串带符号位的二进制数通常称为机器数,它原来的数值形式称为该机器数的真值。原码﹑反码与补码是在计算机技术中广泛用到的机器数,下面分别来学习这3种码以及它们之间的转换关系。
原码表示法又称为符号数值表示法,即码的最高位表示数的符号,后面的各位表示数的大小。例如,一个数的原始形式为:X=-1001001,即X的真值为-1001001。因为数的真值不能直接应用于计算机中,所以要将真值前面的符号数码化,将真值转换为可以应用于计算机的机器数,原码就是一种机器数。X的原码表示为:11001001。下面再举几个例子:
[+1010011]原=01010011
[-1001100]原=11001100
[-1111000]原=11111000
由上述例子可见:
当真值X>0时,例如,X=+101001,[X]原=01010010=X;
当真值X<0时,例如,X=-100110,[X]原=11001100
=10000000+1001100
=10000000-(-1001100)
=2n-X
其中,n是原码的位数(不包括整数位)。
综上所述,一个n位的真值X(不包括整数位)的原码的公式表示方法为:
[X]原=X 0≤X<2n-1
[X]原=2n-1-X -2n-1<X≤0
可见,原码的最高位为符号位,符号为0表示真值为正,符号为1表示真值为负。所以将真值转换为原码时,若真值为正,则直接在其最高位加0;若真值为负,则直接在其最高位加1。
值得注意的是,0的原码有两种表示方法:
[+0]原=00000000
[-0]原=10000000
对于正数,反码的表示方法和原码相同,即最高位为符号位,用0表示,其后各位表示数值的大小。对于负数,由原码变为反码的规则为:除符号位的1不变外,其余各位按位取反,即原来为0的变为1,原来为1的变为0。下面举几个例子:
X=+1001001
[X]原=01001001 [X]反=01001001
X=﹣1001001
[X]原=11001001 [X]反=10110110
通过上面的例子,可以总结出求反码的公式:
[X]反=X 0≤X<2n-1
[X]反=2n+1-1+X -2n-1<X≤0
在反码的表示法中,0的表示法也有两种:
[+0]反=00000000
[-0]反=11111111
对于正数,补码的表示方法和原码相同,即最高位为符号位,用0表示,其后各位表示数值的大小。对于负数,由原码变为补码的规则为:除符号位的1不变外,其余各位按位取反,并在最低位加1。下面举几个例子:
X=+1010001
[X]原=01010001 [X]补=01010001
X=-1010001
[X]原=11001001 [X]补=10110111
通过上面的例子,可以总结出求补码的公式表示法如下:
[X]补=X 0≤X<2n-1
[X]补=2n+1+X -2n-1<X≤0
在补码的表示法中,0的表示法是唯一的。
综上所述可以看出,对于一个正数,有
[X]原=[X]补=[X]反
对于一个负数,有
[X]补=[X]反+1
原码是人们习惯用到且容易识别的一种机器数,做乘除运算比较简单;补码可将数字系统中的减法运算用加法实现,做加减运算比较简单;反码是从原码到补码的过渡形式。值得注意的是,在用补码求和的结果中,要将运算结果产生的进位丢掉,才能得到正确的结果。下面举例说明。
例如,用补码实现X-Y的运算,其中X=1101,Y=0101。
[X]补=01101 [-Y]补=11011
[X]补+[-Y]补=01101+11011
=“1”01000
可见,丢掉最高位的进位1,才得到正确的结果。
表1-1 带符号数的真值﹑原码﹑反码和补码
真 值 |
原 码 |
反 码 |
补 码 |
+0000 |
00000 |
00000 |
00000 |
+0001 |
00001 |
00001 |
00001 |
+0010 |
00010 |
00010 |
00010 |
+0011 |
00011 |
00011 |
00011 |
+0100 |
00100 |
00100 |
00100 |
+0101 |
00101 |
00101 |
00101 |
+0110 |
00110 |
00110 |
00110 |
+0111 |
00111 |
00111 |
00111 |
+1000 |
01000 |
01000 |
01000 |
+1001 |
01001 |
01001 |
01001 |
+1010 |
01010 |
01010 |
01010 |
-0000 |
10000 |
11111 |
|
-0001 |
10001 |
11110 |
11111 |
-0010 |
10010 |
11101 |
11110 |
-0011 |
10011 |
11100 |
11101 |
-0100 |
10100 |
11011 |
11100 |
-0101 |
10101 |
11010 |
11011 |
-0110 |
10110 |
11001 |
11010 |
-0111 |
10111 |
11000 |
11001 |
-1000 |
11000 |
10111 |
11000 |
-1001 |
11001 |
10110 |
10111 |
-1010 |
11010 |
10101 |
10110 |
表1-1列出了-10~+10的带符号数的真值﹑原码﹑反码和补码。
人们习惯用十进制数表示数,但是在计算机中广泛使用二进制数,所以需要用二进制数对十进制数编码,即二-十进制码(Binary Code Decimal),也就是BCD码。这种码既有二进制数的形式,又有十进制数的特点,便于人们理解和数字系统的处理。
一个十进制数有0~9十个不同的数码,因此需要4位二进制数才能表示。但4位二进制数共有24=16种不同的表示方法,所以要从这16种表示法中取出10种来编码,于是出现了很多种编码方式。一般分为有权码和无权码,有权码是指4位二进制数中每一位都有自己对应的权,而无权码的4位二进制数中每一位则没有固定的权。常用的BCD码有8421码、2421码、5421码等,为有权码;还有余三码、格雷码等,为无权码。下面分别介绍几种常见BCD码。
8421码是一种有权码,是最常见的BCD码。它用4位二进制数来表示1位等值的十进制数,且4位二进制数的权由高到低分别为:8﹑4﹑2﹑1,因此在4位二进制数的16种组合中,只用到前10种,后面6种用不到,其编码表如表1-2所示。下面举例说明。
【例1-17】将十进制数(69.27)10转换为8421码。
解:将每位十进制数用4位二进制数表示出来。
6 9 ﹒ 2 7
↓ ↓ ↓ ↓
0110 1001 ﹒ 0010 0111
所以,(69.27)10=(01101001﹒00100111)8421
2421码也是一种有权码,它的4位二进制数的权从高到低分别为:2﹑4﹑2﹑1。若一个用2421码编码的二进制数为X3X2X1X0,则它表示的十进制数X为:
X=2X3+4X2+2X1+1X0
其编码如表1-2所示。
表1-2 常见BCD码
十进制数 |
8421码 |
2421码 |
5421码 |
余三码 |
0 |
0000 |
0000 |
0000 |
0011 |
1 |
0001 |
0001 |
0001 |
0100 |
2 |
0010 |
0010 |
0010 |
0101 |
3 |
0011 |
0011 |
0011 |
0110 |
4 |
0100 |
0100 |
0100 |
0111 |
5 |
0101 |
1011 |
1000 |
1000 |
续上表
十进制数 |
8421码 |
2421码 |
5421码 |
余三码 |
6 |
0110 |
1100 |
1001 |
1001 |
7 |
0111 |
1101 |
1010 |
1010 |
8 |
1000 |
1110 |
1011 |
1011 |
9 |
1001 |
1111 |
1100 |
1100 |
5421码也是一种有权码,它的4位二进制数的权从高到低分别为:5﹑4﹑2﹑1。若一个用5421码编码的二进制数为X3X2X1X0,则它表示的十进制数X为:
X=5X3+4X2+2X1+1X0
其编码如表1-2所示。
余三码是一种无权码,它在数值上比8421码多3,所以称为余三码,它可以用8421码加上0011得到。其编码如表1-2所示。
格雷码是一种很重要的BCD码,它是一种无权码。它最重要的特点是:任意两个相邻的格雷码之间,只有一位码元不同,它的这种特点使它在形成代码与传输中不容易出错,可靠性高。格雷码有很多形式,这里只介绍典型格雷码。典型格雷码不仅可以对十进制数编码,而且可以对任意二进制数编码。这里介绍用格雷码对二进制数编码的规则。
设二进制数:B=Bn-1Bn-2…B1B0,对应的格雷码:G=Gn-1Gn-2…G1G0,则有
Gi=Bi+1?Bi
即格雷码的第i位码可以由二进制码的第i和第i+1位码进行异或运算得到。异或运算的运算规则为:
0?0=0 0?1=1?0=1 1?1=0
表1-3所示为二进制码与典型格雷码的转换关系。
表1-3 二进制码与格雷码的转换关系
十进制数 |
二进制码 |
格雷码 | ||||||
N |
B3 |
B2 |
B1 |
B0 |
G3 |
G2 |
G1 |
G0 |
0 |
0 0 0 0 0 0 |
0 0 0 0 1 1 |
0 0 1 1 0 0 |
0 1 0 1 0 1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 | ||||
2 |
0 |
0 |
1 |
1 | ||||
3 |
0 |
0 |
1 |
0 | ||||
4 |
0 |
1 |
1 |
0 | ||||
5 |
0 |
1 |
1 |
1 |
续上表
十进制数 |
二进码 |
格雷码 | ||||||
N |
B3 |
B2 |
B1 |
B0 |
G3 |
G2 |
G1 |
G0 |
6 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
7 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
8 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
9 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
10 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
11 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
12 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
13 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
14 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
15 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |