现在的位置: 首页 > 综合 > 正文

原码 反码 补码

2013年10月18日 ⁄ 综合 ⁄ 共 2103字 ⁄ 字号 评论关闭

转自 http://www.cnblogs.com/liushuijinger/archive/2012/04/18/2454677.html && http://baike.baidu.com/view/377340.htm &&

http://www.cnblogs.com/liushuijinger/archive/2012/04/05/2433718.html

补码(two's complement)

     计算机系统中,数值一律用补码来表示(存储) 主要原因:

      使用补码,可以将符号位和其它位统一处理;

      同时,减法也可按加法来处理。

      另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃

      补码与原码的转换过程几乎是相同的。


总所周知,计算机内部的所有数都是以二进制的形式存在的。而二进制在计算机里又有多种编码方式——原码、反码、补码等。而在这些编码方式里面用得最多的不是最简单、最直接的原码而是补码。这是为什么呢?想搞懂这个问题首先得明白什么是原码、反码以及补码,如果你对他们还不太了解,那就先看看我另一篇博客——原码、反码、补码其实很简单。如果你对他们已经很熟悉,那么我们继续往下看。



A、B、C三种相似的东西,选C而不选A和B,那么C肯定具有其他两者所没有的优势。那么补码究竟有什么优势让他备受青睐呢?下面我们具体的分析一下:


原码:

原码的特点就是编码简单直观,与真值转换非常方便。既然原码这么好,那为什么不选他而选补码呢?接下来就是不选他的关键所在,虽然原码非常的简单直观,但是当用原码表示0的时候就会出问题。0用原码表示分为+0和-0,当机器字长为8时,

[+0]原=00000000,[-0]原=10000000。

这就有问题了,同一个数却有两种表示,产生了二义性,从而给机器判断0带来了麻烦;二是用原码运算时,符号位需要单独处理,而且运算规则很复杂。例如加法运算,若两个数异号,则先要让绝对值大的数减去绝对值小的数,然后把绝对值大的数的符号付给结果。还有就是,借位操作如果用计算机硬件实现起来是很困难的。正是因为原码有这些不足之处,才促使人们研究其他的编码方法。

 

反码:

反码很少会被用到,他主要的用途就是作为原码与补码的一个桥梁。他和原码一样对0有两种表示方法,

[+0]反=00000000,[-0]反=11111111。

不采用反码的原因跟原码差不多,就不赘述了。

 

补码:

说到补码,就不得不引人另一个概念——模数。模数从屋里意义上讲是某种计量器的容量。这里我们经常举的一个例子就是钟表,其模数为12,即每到12就重新从0开始,数学上叫取模或求余(mod),java、C#和C++里用%表示求余操作。例如:

14%12=2

如果此时的正确时间为6点,而你的手表指向的是8点,如何把表调准呢?有两种方法:一把表逆时针拨两个小时;二是把表顺时针拨10个小时,即

8-2=6

(8+10)%12=6

也就是说在此模数系统里面有

8-2=8+10

这是因为2跟10对模数12互为补数。因此有一下结论:在模数系统中,A-B或A+(-B)等价于A+[B补],即

8-2/8+(-2)=8+10

我们把10叫做-2在模12下的补码。这样用补码来表示负数就可以将加减法统一成加法来运算,简化了运算的复杂程度。

采用补码进行运算有两个好处,一个就是刚才所说的统一加减法;二就是可以让符号位作为数值直接参加运算,而最后仍然可以得到正确的结果符号,符号位无需再单独处理。

 

以上就是我对原码、反码、补码的一些肤浅理解,希望对大家有所帮助,同时欢迎各位高手不吝赐教!感激不尽!


---------------------------------------------------------------------------------------------------------------------------------

原码:

如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为1,负数为0。剩下的n-1位表示概数的绝对值。
例如: X=+101011 , [X]原= 00101011    X=-101011 , [X]原= 10101011 
位数不够的用0补全。
PS:正数的原、反、补码都一样。

反码:

知道了什么是原码,那反码就更是张飞吃豆芽——小菜一碟了。知道了原码,那么你只需要具备区分0跟1的能力就可以轻松求出反码,为什么呢?因为反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100


补码:

补码也非常的简单就是在反码的基础上按照正常的加法运算加1。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101

移码:


移码最简单了,不管正负数,只要将其补码的符号位取反即可。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101,[X]移=01010101


抱歉!评论已关闭.