原码、反码和补码
序言
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
原码反码补码三者一一对应,在各自属性内具有唯一性。
一. 原码
什么是原码?
原码(true form)是一种计算机中对数字的二进制定点表示方法,是有符号数的最简单的编码方式。
原码表示法在数值前面增加了一位符号位(即最高位为符号位):
正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
原码的优点:简单直观。
例如我们用8位二进制表示一个数,+11的原码为0000 1011,-11的原码就是1000 1011
原码的缺点:不能直接参加运算,可能会出错。
例如数学上,1+(-1)=0,而在二进制中 0000 0001 + 1000 0001 = 1000 0010,
换算成十进制为-2,显然出错了。
由于原码的符号位不能直接参与运算,必须和其他位分开,如果用原码进行计算就增加了硬件的开销和复杂性。
二. 反码(源码与补码之间的过渡码)
什么是反码?
在计算机内,定点数有3种表示法:原码、反码和补码。
反码是数值存储的一种,但是由于补码更能有效表现数字在计算机中的形式,所以多数计算机都不采用反码表示数。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
数0的反码也有两种形式,即
[+0]反=00000000B
[- 0]反=11111111B
三. 补码
在计算机系统(包括内存)中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
补码的正零与负零表示方法相同。
[+0]补 = [-0]补 = 0000 0000B
(1) 已知原码,求补码。
由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。
(2) 已知补码,求原码。
分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1有方法。
总结:
正数:原码 = 反码 = 补码
负数:原码取反加1得补码。
补码取反加1得原码。
负数补码与原码相互转换,其运算过程是相同的。
说明:取反时符号位不变。