
3.2.3 带符号数的表示
机器数在计算时,若将符号位和数值一起运算将会产生错误的结果。
例如,-3+2的结果应为-1,但-3+2的机器数运算结果为-5。

为解决此类问题,在机器数中,负数有原码、反码和补码3种表示方法。其主要目的是解决减法运算问题。任何带符号正数的原码、反码和补码的形式完全相同,带符号负数则各有不同的表示形式。
1.原码
正数的符号位用0表示,负数的符号位用1表示,数值部分用二进制形式表示,这种表示法称为原码表示法。原码与机器数相同。
例如,用8位二进制数表示十进制整数+5和-5时,其原码分别为:

下面将考虑一个特例,即+0和-0的原码形式。

由此可见,+0和-0的原码形式不一致,但是从人们的常规意识和运算角度而言,+0和-0的数值、表示形式和存储形式应该是一致的。这种不一致性在计算机处理过程中可能会带来不便,因此数在计算机中通常不采用原码表示形式。
2.反码
正数的反码和原码相同,负数的反码是对该数的原码除符号位外各位按位取反。
例如,用8位二进制数表示十进制整数+5和-5时,其反码分别为:

下面将考虑一个特例,即+0和-0的反码形式。

由此可见,+0和-0的反码形式也出现了不一致。同样,这种不一致性在计算机处理过程中可能会带来不便。因此,数在计算机中通常也不采用反码表示形式。
3.补码
在普通的钟表上,18时和6时表针所指的位置是相同的,因为它们对于12具有相同的余数,简称同余。补码是根据同余的概念引入的,对于二进制而言,正数的补码和原码相同,负数的补码是其反码加1。
例如,用8位二进制数表示十进制整数+5和-5时,其补码分别为:

下面将考虑一个特例,即+0和-0的补码形式。

由此可见,+0和-0的补码形式具有一致性,这既符合人们的常规意识和运算规则,同时对计算机处理而言具有很大的方便性,因此在计算机中的数通常采用补码形式进行存储和运算。