• 内容讲解

1. 机器数和真值

二进制数有正负之分,如N1=+0.101101,N2=-0.101101,则N1是个正数,N2是个负数。机器不能直接把符号“+”、“-”表示出来,为了能在计算机中表示正负数,必须引入符号位,即把正负符号也用1位二进制数码来表示。把符号位和数值位一起编码来表示相应的数的表示方法包括:原码、补码、反码、移码等。

为了便于在计算机中表示,同时又便于与实际值相区分,在此首先引入机器数和真值的概念。

机器数  用二进制数“0”或“1”来表示数的符号,“0”表示正号,“1”表示负号,且把符号位置于该数的最高数值位之前,这样表示的数称为机器数(或称机器码),即把符号位和数值位一起编码来表示的数就是机器数。

真值  一般书写中用“+”、“-”来表示数的符号,这样表示的数称为真值。

例如:N1 = +0.101101,N2 = -0.101101,这是真值,表示成机器数(以原码为例)就是[N1]= 0.101101,[N2] = 1.101101。

机器数有原码、补码、反码和移码四种表示形式。下面以整数为例说明原码、补码、反码和移码的表示方法。

2. 原码

符号位为0表示正数,为1表示负数,数值部分用二进制数的绝对值表示的方法称为原码表示法,通常用[X]表示X的原码。

例如,要表示+59和-59的原码。假设机器数的位数8位(即机器的字长为8位),最高位是符号位,其余7位是数值位,那么,+59和-59的原码分别表示为:

[+59]=00111011                  [-59]=10111011

写成一般式则为:

正数的原码         [X]=X             (0<X<2n-1)

负数的原码         [X]=2n-1-X       (-2n-1<X<0)

注意:0的原码有两个值,有“正零”和“负零”之分,机器遇到这两种情况都当作0处理。

[+0]=00000000                    [-0]=10000000

原码的表示方法简单易懂,与真值转换方便,但在进行加减法运算时,符号位不能直接参加运算,而是要分别计算符号位和数值位。当两数相加时,如果是同号,则数值相加;如果是异号,则要进行减法运算。而在进行减法运算时,还要比较绝对值的大小,然后用大数减去小数,最后还要给运算结果选择恰当的符号。

为了解决这些问题,人们引进了数的补码表示法。

3. 补码

什么是补码?我们先用日常生活中的实例来进行说明。假如现在时间是7点,而你的手表却指向了9点,如何调整手表的时间?有两种方法拨动时针,一种是顺时针拨,即向前拨动10个小时;另一种是逆时针拨,即向后拨2个小时。从数学的角度可以表示为:

(9+10) -12=19-12=7

或 9-2=7

可见,对钟表来说,向前拨10个小时和向后拨2个小时的结果是一样的,减2可以用加10来代替。这是因为钟表是按12进位的,12就是它的“模”。对模12来说,-2与+10是“同余”的,也就是说,-2与+10对于模12来说是互为补数的。

计算机中的加法器是以2n为模的有模器件,因此可以引入补码,把减法运算转换为加法运算,以简化运算器的设计。

补码的定义:把某数X加上模数K,称为以K为模的X的补码。

[X]=K+X

因此,正数的补码的最高位为符号“0”,数值部分为该数本身;负数的补码的最高位为符号“1”,数值部分为用模减去该数的绝对值。

通过用模2n减去某数的绝对值的方法来求某数的补码比较麻烦,求一个二进制数的补码的简便方法是:正数的补码与其原码相同;负数的补码是符号位不变,数值位逐位取反(即求其反码),然后在最低位加1。

例如,[+59]=[+59]=00111011,而[-59]=10111011,因此,[-59]= 11000100+1 = 11000101。

注意:0的补码只有一种形式,就是n位0。

采用补码表示法进行加减法运算,比原码运算方便多了,符号位可以和数值位一起参加运算,而且不论数是正还是负,计算机总是做加法,减法运算可转换为加法运算。

4. 反码

引入反码的目的是便于求负数的补码。

正数的反码与原码相同,负数的反码是符号位不变,数值位逐位取反。

例如:[+59]=[+59]=00111011,而[-59]=10111011,因此,[-59]=11000100。

注意:0的反码也有两个,[+0]=00000000,[-0]=11111111

在计算机中,求一个数的反码很容易,因此,求一个数的补码也就易于实现。

采用补码运算,计算机的控制线路较为简单,所以,目前大多数计算机均采用补码存储、补码运算,其运算结果仍为补码形式。

综上所述,在n位机中,用n位二进制数补码表示一个带符号的整数时,最高位为符号位,后面n-1位为数值部分。n位二进制数补码表示的范围为-2n-1~+2n-1-1。例如,在8位机中,补码表示的范围为-128~+127。

表2-2列出了8位二进制数码在各种表示形式下的对应真值。

表2-2  8位二进制数的各种表示方法

213.gif

5)移码

移码也称为增码或偏码,常用于表示浮点数中的阶码。

移码可由补码求得,只要把补码的符号位取反就得到了移码。