鱼C论坛

 找回密码
 立即注册
查看: 2284|回复: 4

[技术交流] 什么是补码 新手想了很久才略微明白了

[复制链接]
发表于 2013-3-29 18:45:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. [code][b]补码
  2.   计算机只能进行加法,但是往往还需要减法运算,如何让计算机加法加出减法的功效呢?于是有人天才般的引入补码,解决了这个问题。
  3.   
  4.   当我们想把25,-2这两个数存入内存单元中时,内存单元显示的是怎样的数据呢?
  5.   他应该是11001,因为是8位1字节,所以是00011001。同理-2应该是 -00000010 。
  6.   问题就出在这个负号上。计算机里只有0和1.他不会有负号,那么负号怎么办?
  7.   把符合去掉?那00000010就是2 ,显然不对。把数据变成其他的二进制?那我们可以把变掉的二进制放入计算器里面转换一下,肯定是个正数,哪里来的负数呢?
  8.   
  9.   这个时候,有人就想到了,用正数来代替负数。不过这很奇怪,从数学的角度讲,减去一个数等于加上一个数?这不可能吧。
  10.   但是就有这样的情况。不知道大家还记得物理学上的波长吗?其中有个周期T。移动T或者T的倍数,结果是一样的。减去T或者T的倍数,结果也是一样。我们只要规定一个周期T,不能行了?
  11.   
  12.   时钟就是这个原理。他是1~12个点构成。周期T = 12 。现在时钟不准了,时间是2点,实际上是3点,那么该怎样调整呢?
  13.   
  14.   这里有两种方法,第一是顺时针转一圈,第二是逆时针转11圈。这用数学表示就是:
  15.   2 + 1 = 3     2 - 11 = 3 = 2 -12 +1
  16.   
  17.   这样就有眉目了。用加法加出减法的效果。比如:
  18.   25  - 2 = 23
  19.   25 + 98 = (1)23
  20.   只要能把 (1)去掉,那么 25 -2 就等于 25 +98 .我们只要设置T = 100就行了。
  21.   
  22.   时钟就是12为周期,本质上讲,他存在一个“丢弃”行为来实现周期。那就是12 加1 ,他会把12这个周期给丢弃。结果就变成了1.
  23.   
  24.   创立补码的人就想,二进制我们也设置一个周期,来一个“丢弃”体制,不就行了吗?
  25.   比如说8位,如果溢出变9位了,那就把第9位去掉。那么他的周期是多少呢?
  26.   这里的T = 256 (不用多解释了吧)
  27.   
  28.   现在剩下的事情,就是把 -2 转换成一个等效的正数,存在内存单元里,前面说过, T = 256 那么究竟等效的正数是多少呢?  我们把这个等效的正数称为补码
  29.   
  30.   求这个等效的正数的公式:(求补码公式)
  31.   -2  的绝对值 2,变成8位的二进制,然后把最高位的0改写成1.(到这里数据称为原码)   
  32.   -2的原码10000010 再保留最高位,让后7位全部取反,取反就是0变1,1变0.那么结果就是11111101.这个结果称为 -2 的反码。 然后反码+1 就变成补码。-2的补码是 11111110 。
  33.   
  34.   根据补码的效果,我们来看看是不是这样:
  35.   25 (00011001) + 11111110  = 100010111  = 00010111 (第9位自动舍弃)
  36.   计算器算一下,是不是23?  加上一个负数,等于加上这个负数的补码。
  37.   
  38.   
  39.   那么为何会这么神奇呢?下面进行具体的数学推导过程:
  40.   设 A ,C .设周期为T ,令 A-C
  41.    
  42.   - C 的原码是 C的最高位变1 。对于8位来说,256是周期 T ,那么最高位变1 意味着什么?
  43.   意味着 - C变成了  C +  T/2 (能明白这步吧?)
  44.   
  45.   原码变反码意味着:  C + T/2 变成了 T / 2  + (T /2   -    C   -   1)
  46.   反码变补码就是反码加1 ,最后补码就是 T - C
  47.   
  48.   好了 也就是说 - C的补码是 T - C
  49.   所以公式  A - C = A + (-C的补码) = A + T - C
  50.   
  51.   
  52.   那么正数的补码是什么呢?人们规定:正数的原码,补码,反码都不变,因为不需要变嘛!
  53.   
  54.   计算机中的数值都是以补码形式储存的。正数不变,负数变。[/b]
复制代码
[/code]
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-29 23:48:06 | 显示全部楼层
我觉得楼主上面写的不错呀。在理。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-30 18:51:34 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-6 20:13:50 | 显示全部楼层
感谢楼主分享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-6 20:25:36 | 显示全部楼层
真是难得给力的帖子啊。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-22 03:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表