新手学习中 发表于 2013-3-29 18:45:27

什么是补码 新手想了很久才略微明白了

补码
  计算机只能进行加法,但是往往还需要减法运算,如何让计算机加法加出减法的功效呢?于是有人天才般的引入补码,解决了这个问题。
  
  当我们想把25,-2这两个数存入内存单元中时,内存单元显示的是怎样的数据呢?
  他应该是11001,因为是8位1字节,所以是00011001。同理-2应该是 -00000010 。
  问题就出在这个负号上。计算机里只有0和1.他不会有负号,那么负号怎么办?
  把符合去掉?那00000010就是2 ,显然不对。把数据变成其他的二进制?那我们可以把变掉的二进制放入计算器里面转换一下,肯定是个正数,哪里来的负数呢?
  
  这个时候,有人就想到了,用正数来代替负数。不过这很奇怪,从数学的角度讲,减去一个数等于加上一个数?这不可能吧。
  但是就有这样的情况。不知道大家还记得物理学上的波长吗?其中有个周期T。移动T或者T的倍数,结果是一样的。减去T或者T的倍数,结果也是一样。我们只要规定一个周期T,不能行了?
  
  时钟就是这个原理。他是1~12个点构成。周期T = 12 。现在时钟不准了,时间是2点,实际上是3点,那么该怎样调整呢?
  
  这里有两种方法,第一是顺时针转一圈,第二是逆时针转11圈。这用数学表示就是:
  2 + 1 = 3   2 - 11 = 3 = 2 -12 +1
  
  这样就有眉目了。用加法加出减法的效果。比如:
  25- 2 = 23
  25 + 98 = (1)23
  只要能把 (1)去掉,那么 25 -2 就等于 25 +98 .我们只要设置T = 100就行了。
  
  时钟就是12为周期,本质上讲,他存在一个“丢弃”行为来实现周期。那就是12 加1 ,他会把12这个周期给丢弃。结果就变成了1.
  
  创立补码的人就想,二进制我们也设置一个周期,来一个“丢弃”体制,不就行了吗?
  比如说8位,如果溢出变9位了,那就把第9位去掉。那么他的周期是多少呢?
  这里的T = 256 (不用多解释了吧)
  
  现在剩下的事情,就是把 -2 转换成一个等效的正数,存在内存单元里,前面说过, T = 256 那么究竟等效的正数是多少呢?我们把这个等效的正数称为补码
  
  求这个等效的正数的公式:(求补码公式)
  -2的绝对值 2,变成8位的二进制,然后把最高位的0改写成1.(到这里数据称为原码)   
  -2的原码10000010 再保留最高位,让后7位全部取反,取反就是0变1,1变0.那么结果就是11111101.这个结果称为 -2 的反码。 然后反码+1 就变成补码。-2的补码是 11111110 。
  
  根据补码的效果,我们来看看是不是这样:
  25 (00011001) + 11111110= 100010111= 00010111 (第9位自动舍弃)
  计算器算一下,是不是23?加上一个负数,等于加上这个负数的补码。
  
  
  那么为何会这么神奇呢?下面进行具体的数学推导过程:
  设 A ,C .设周期为T ,令 A-C
   
  - C 的原码是 C的最高位变1 。对于8位来说,256是周期 T ,那么最高位变1 意味着什么?
  意味着 - C变成了C +T/2 (能明白这步吧?)
  
  原码变反码意味着:C + T/2 变成了 T / 2+ (T /2   -    C   -   1)
  反码变补码就是反码加1 ,最后补码就是 T - C
  
  好了 也就是说 - C的补码是 T - C
  所以公式A - C = A + (-C的补码) = A + T - C
  
  
  那么正数的补码是什么呢?人们规定:正数的原码,补码,反码都不变,因为不需要变嘛!
  
  计算机中的数值都是以补码形式储存的。正数不变,负数变。

小亮1201 发表于 2013-3-29 23:48:06

我觉得楼主上面写的不错呀。在理。

新手学习中 发表于 2013-3-30 18:51:34

小亮1201 发表于 2013-3-29 23:48 static/image/common/back.gif
我觉得楼主上面写的不错呀。在理。

哇咔咔 谢谢哈小甲鱼汇编入门看完没啊~?

毛驴 发表于 2013-4-6 20:13:50

感谢楼主分享

jonas82 发表于 2013-4-6 20:25:36

真是难得给力的帖子啊。
页: [1]
查看完整版本: 什么是补码 新手想了很久才略微明白了