您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《数字电子技术》 > 第1章 数制与码制

第3节 带符号数的代码表示

 

1.3.1  真值与机器数

    上述讨论的过程中都没有考虑二进制数的符号,一般认为其为正数,但在算术运算过程中,总会出现负数。实际上不带符号的数是数的绝对值,在绝对值前加上表示正负的符号(+/- )就成了带符号数。它可由两部分组成:一部分是表示数的符号,另一部分是表示数的数值。由于数的符号是一个具有正、负两种值的离散信息,所以它可以用一位二进制数来表示。通常是以0表示正数,以1表示负数。对于一个n位二进制数,如果数的第一位为符号位,那么余下的n-1位就表示数的数值部分。

一般,直接用正号“+”和负号“-”来表示符号的二进制数,称为符号数的真值。数的真值形式是一种原始形式,无法直接用在数字计算机中。但是,当将符号数值化之后,便可以在计算机中使用它了。因此在计算机中使用的符号数便称为机器数。

    如二进制正数+1011在机器中的表示为01011,二进制负数-1011在机器中的表示为11011。

    通过前面介绍的二进制数的加、减、乘、除四种运算可知,乘法运算实际上是做左移加法运算,而除法运算则是做右移位减法运算。即在机器中只需要做加、减两种运算。但在做减法运算时,必须先比较两个数绝对值的大小,再将绝对值大的数减绝对值小的数,最后在相减结果的前面加上绝对值较大的数的符号。因此,虽然逻辑电路可以实现减法运算,但所需的电路复杂,运算速度较作加法慢得多。为了能使减法运算变成加法运算,人们给出了三种机器数的表示形式,即原码、反码和补码。

1.3.2  原码

    原码又被称为“符号—数值表示”。用当原码形式表示正数和负数的,第1位是符号位。对于正数,符号位表示的0,对于负数,符号位表示的1,其余各位表示数值部分。

假如两个带符号的二进制数分别为S1和S2,其真值形式为

S1= +11001    S2= -01011

则S1和S2的原码表示形式为

[S1]= 011001    [S2]= 101011

根据上述原码形成规则,一个n位的整数S (包括一位符号位)的原码一般表达式为

              (1.3.1)

对于定点小数而言,一般将小数点定在最高位的左边,此时,数值小于1。定点小数原码一般表达式为

                  (1.3.2)

    由原码的一般表达式中可以得出:

     (1 )当S为正数时,[S]和S的区别只是增加一位用0表示的符号位。由于在数的左边增加一位0对该数的数值并无影响,所以[S]就是S本身。

     (2 )当S为负数时,[S]和S的区别是增加了一位用1表示的符号位。

     (3 )在原码表示中,有两种不同形式的0,即

[+0]= 0.00…0

[- 0]= 1.00…0

1.3.3  反码

反码又称为“对1的补数”。当用反码表示时,左边第1位即为符号位,符号位为0代表正数,符号位为1代表负数。对于正数,反码和原码相同。而对于负数,反码的数值是将原码数值按位求反,即原码的某位为1,则反码的相应位便为0,或者原码的某位为0,反码的相应位便为1。所以,反码数值的形成与它的符号位有关。

假如两个带符号的二进制数分别为S1和S2,其真值形式为

 S1= +1l001   S2= -01011

则S1和S2的反码表示形式为

[S1]= 011001    [S2]= 110100

根据上述的反码形成规则,一个n位的整数S (包括一位符号位)的反码一般表达式为

                   (1.3.3)

 同样,对于定点小数,如果小数部分的位数为m,则它的反码一般表达式为

                      (1.3.4)

从反码的一般表达式可以看出:

 (1 )正数S的反码[S]与原码[S]相同。

 (2 )对于负数S,其反码[S]的符号位为1,数值部分是将原码数值按位求反。

 (3 )在反码表达式中,0的表示有两种不同的形式,即

[+0]= 0.00…0

[-0]= 1.11…1

  1. 3. 4  补码

    补码又称为“对2的补数”。在补码表示方法中,正数的表示同原码和反码的表示是一样的,而负数的表示却不相同。对于负数,将原码转变成补码的规则是:符号位不变,仍为l,数值部分变反加1,即逐位变反,在最低位加1。

    如两个带符号的二进制数分别为S1和S2,其真值表达式为

S1= +11001      S2= -01011

则S1和S2的补码表示形式为   

[S1]= 011001    [S2]= 110101

根据上述补码形成规则,一个n位的整数S (包括一位符号位)的补码一般表达式为

                    (1.3.5)

同样,对于定点小数,补码一般表达式可写成

                         (1.3.6)

    由补码的一般表达式可以看出:

     (1 )正数S的补码[S]、反码[S]和原码[S]是相同的 

     (2 )对于负数,补码[S]的符号位为1,其数值部分为反码的数值末位加1。

     (3 )在补码表示法中,0的表示形式是唯一的。即

    [+0]= 0.00…0

    [-0]= 0.00…0

1. 3. 5  机器数的运算

    前面介绍了带符号数的三种表示法,由于形成规则不同,加、减运算的规律也不相同。下面分别加以介绍。    

    一、原码运算

    原码中的符号位仅用来表示数的正、负,不参加运算。进行运算的只是数值部分。原码运算时,应首先比较两个数的符号,若两数的符号相同,则可将两个数的数值相加,最后给结果附上相应的符号;若两数的符号不同,则需比较两数的数值大小,然后将数值较大的数减去数值较小的数,并将数值较大的数的符号作为最后结果的符号。下面举例说明。

    1.3.1  已知S1=  0.1001,S2= -0.0101,求[S2+S1  ]和[S2-S1]

    :    [S2+S1]= [ (-0.0101 )+ (0.1001 )]

    由于S1和S2的符号不同,并且的S1绝对值大于S2的绝对值,因此要进行S1减S2的运算,其结果为正。

运算结果为原码,即

[S2+S1]= 0.0100

故其真值为

S2+S1= 0.0100

    又     [S2-S1]= [ (-0.0101 )- (0.1001 )]

    由于S1和S2的符号相同,因此,实际上要进行Sl加S2的运算,其结果为负。

运算结果为原码,即

 [S2-S1]= 1.1101

故其真值为

S2-S1 = -0.1101

 

    二、反码运算

由反码的定义可以得到反码加、减运算规则如下:

[S2+S1]= [S2]+[S1]

[S2-S1]= [S2]+[-S1]

反码的加、减运算规则表明:两数和的反码等于两数的反码之和,而两数差的反码也可以用加法来实现。运算时,符号位和数值位一样参加运算,如果符号位产生进位,则需将此进位加到和数的最低位,称之为“循环进位”。运算结果的符号位为0时,说明是正数的反码,与原码相同;运算结果的符号位为1时,说明是负数的反码,应再对运算结果求反码,才得到原码。下面举例说明。

    1.3.2  已知S1=  0.1001,S2= -0.0101,求[S2+S1]和[S2-S1]

    解:  [S2+S1]= [S2]+ [S1]=  1.1010+0.1001

由于符号位产生了进位,因此要进行“循环进位”,即 

[S2+S1]=  0.0100

由于其符号位为0,则其真值为S2+S1=  0.0100

又  [S2-S1]=  [S2]+ [-S1]=  1.1010+1.0110

由于符号位产生了进位,因此要进行“循环进位”,即

[S2-S1]=  1.0001

由于其符号位为1,则其真值为S2-S1=  -0.1110

    三、补码运算

    补码运算同反码运算一样,两数差的补码可以用两数补码的加法来实现。补码加、减运算规则是:

[S2+S1]=  [S2]+[S1]

[S2-S1]=  [S2]+[-S1]

    运算时,符号位和数值位一样参加运算,如果符号位产生了进位,则此进位可“略去”。运算结果符号位为0时,说明是正数的补码,与原码相同。运算结果符号位为l,说明是负数的补码,应对结果再求补码才得原码。

    下面举例说明。

    1.3.3  已知S1=  0.1001,S2=  -0.0101,求[S2+S1]和[S2-S1]

    解:  [S2+S1]=  [S2]+[S1]=  1.1011+0.1001

由于符号位产生了进位,因此,要将此进位略去,即

[S2+S1]=  0.0100

    运算结果的符号位为0,说明是正数的补码,补码与原码相同。

由于其符号位为0,则其真值为

S2+S1=  0.0100

 又   [S2-S1]补=  [S2]+[-S1]=  1.1011+1.0111

由于符号位产生了进位,因此,要将此进位略去,即

[S2-S1]=  1.0010

运算结果的符号位为1,说明是负数的补码,应对补码求补后才能得到原码,即

[S2-S1]=  1.1110

由于其符号位为1,则其真值为

S2-S1= -0.1110

从上述的讨论可以看出,原码、反码和补码各有优缺点。原码表示法简单方便,但原码减法必须做真正的减法,不能用加法来代替,因此实现原码运算所需的逻辑电路比较复杂。反码和补码的优点是只需用加法逻辑电路便可实现。并且用补码进行减法运算很方便,它只需进行一次算术相加。而用反码进行减法运算,若符号位产生进位就需进行两次算术相加。而且反码还有一个缺点,就是具有两个零值,这容易在计算过程中产生歧意。