计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

原码

原码 (true form) 是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

简单直观;例如,我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011

原码不能直接参加运算,可能会出错。

例如数学上,1+(-1)=0,而在二进制中原码

1
00000001+10000001=10000010

换算成十进制为-2。显然出错了。

反码

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

正数:正数的反码与原码相同。
负数:负数的反码,符号位为“1”,数值部分按位取反。

例如: 符号位 数值位

1
2
3
4
5
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
注意:数0的反码也有两种形式,即
[+0]反=00000000B
[- 0]反=11111111B

补码

正整数的补码与原码相同。负整数的补码等于反码加一。

数0的补码表示是唯一的。

2的补码就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电路完成。

随便写一个计算式,16 + (-8) = ?

1
2
3
4
 00010000
+11111000
---------
100001000

可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。

—EOF—