首页 > 代码库 > 软考——再看原码、反码、补码

软考——再看原码、反码、补码

    众所周知,一个正数的原码、补码、反码是相同的,负数则不同。先提一个问题,为什么在计算机中要使用这些编码方式呢?


1. 原码

   将最高位用做符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值的表示形式。这种方式是最容易理解的。

    例如,+1的原码是00000001-1的原码是10000001

    但是直接使用原码在计算时却会有麻烦,比如(1)10+(-1)10=0,如果直接使用原码则:

(00000001)2+(10000001)2=(1000010)2

    这样计算的结果是-2,也就是说,使用原码直接参与计算可能会出现错误的结果。所以,原码的符号位不能直接参与计算,必须和其他位分开,这样会增加硬件的开销和复杂性。


2. 反码

   正数的反码与原码相同。负数的反码符号位为 1,其余各位为该数绝对值的原码按位取反。这个取反的过程使得这种编码称为“反码”。

    例如,-1的反码:11111110

    同样对上面的加法,使用反码的结果是:

(00000001)2+(11111110)2=(11111111)2

    这样的结果是负0,而在人们普遍的观念中,0是不分正负的。反码的符号位可以直接参与计算,而且减法也可以转换为加法计算。([+0]=00000000[-0]=11111111


3. 补码

   正数的补码与原码相同。负数的补码是该数的反码加1,这个加 1就是“补”。

    例如,-1的补码:11111111

    再次做加法是这样的:

(00000001)2+(11111111)2=(00000000)2

    直接使用补码进行计算的结果是正确的(:在补码表示中,[+0]=00000000[-0]=000000000——所以0有唯一的编码00000000,不分正负)。注意到我们这里只是举例,并非证明。

    对一个补码表示的数,要计算其原码,只要对它再次求补,可得到该数的原码。

    由于补码能使符号位与有效值部分一起参加运算,从而简化运算规则,同时它也使减法运算转换为加法运算,进一步简化计算机中运算器的电路,这使得在大部分计算机系统中,数据都使用补码表示。


    犹记得两年前,学会了这几种编码的转换,“只知其然,不知其所以然”,通过这次软考,让自己能够去想这个问题。“学习是一种过程”,越来越能体会到这句话人真谛吧。弱地问一句,您现在知道计算机中使用这些编码的原因了吧?(反正我知道了,嘻嘻^-^)