| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 348 人关注过本帖
标题:关于补码的文章 自己(copy)
只看楼主 加入收藏
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
结帖率:95.74%
收藏
 问题点数:0 回复次数:0 
关于补码的文章 自己(copy)
给大家提供一个小技术。
怎么破解网上复制的限制,比喻这篇文章本来就有复制的限制。
有些文章连起码的选择都不可以,这样可以可以通过搜狗带的工具 《去除限制》 来进行解除。
然后用网博士 一种保存网页上的全部类容的工具 把他保存下来 就可以复制了。。。。。
负数在计算机中如何表示?
举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢?
很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示


正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位
。那么,+8就是00001000,而-8则是10001000。
但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用2的补
码(Two's Complement)表示负数。
什么是2的补码?
它是一种数值的转换方法,要分二步完成:


第一步,每一个二进制位都取相反值,0变成1,1变成0。比如,00001000的相反


值就是11110111。


第二步,将上一步得到的值加1。11110111就变成11111000。


所以,00001000的2的补码就是11111000。也就是说,-8在计算机(8位机)中就


是用11111000表示。


不知道你怎么看,反正我觉得很奇怪,为什么要采用这么麻烦的方式表示负数,


更直觉的方式难道不好吗?


为什么要用2的补码


首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能


够保持一一对应的关系,就可以用任意方式表示负数。所以,既然可以任意选择


,那么理应选择一种最方便的方式。


2的补码就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电


路完成。


还是以-8作为例子。


假定有两种表示方法。一种是直觉表示法,即10001000;另一种是2的补码表示法


,即11111000。请问哪一种表示法在加法运算中更方便?


随便写一个计算式,16 + (-8) = ?


16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:


 00010000
+10001000
---------
 10011000


可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就


是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适


用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还


有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。


现在,再来看2的补码表示法。


 00010000
+11111000
---------
100001000


可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位


的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会


被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 +


(-8) 的正确答案。这说明了,2的补码表示法可以将加法运算规则,扩展到整个


整数集,从而用一套电路就可以实现全部整数的加法。


2的补码的本质及正确性


我们要看先一下模的概念


“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机


器,它也有一个计量范


  围,即都存在一个“模”。例如:


  时钟的计量范围是0~11,模=12。


  表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。


  “模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,


计量器上只能表示出模的


  余数。任何有模的计量器,均可化减法为加法运算。


  例如: 假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种


拨法:


  你可以往回拨4个小时,也可以向前拨8个小时(12-10+6,在钟表系统里模是


12)


  在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加


8来代替。


  对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和


3,7和5,6和6都有这个特


  性。共同的特点是两者相加等于模。


  对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大


数是11111111,若再


  加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000


,所以8位二进制系统的


  模为2^8。 在这样的系统中减法问题也可以化成加法问题,只需把减数用相


应的补数表示就可以


  了。


       再次重申一下这句话:


      在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用


加8来代替。      


      所以对于模为10000 0000的8位系统来说,减去b和加上10000 0000-b是一


个道理,而(10000 0000-b)是什么?恰好就是b的补码


补码怎么求,“取反加一”这口诀怎么来的?


承认了8 - 5 = 8 + (-5的补码)这个事实后,我们来看-5的补码怎么求,“取


反加一”怎么来的


其实看完了上面的模的问题,该问题的答案基本已经出来了


-5的补码是 10000 0000 - 5 = 1111 1111 + 1 -5 = (1111 1111 - 5) + 1


1111 1111减去一个数事实上就是在对这个数取反,后面那个是+1


两个小问题的解释:


(1)


32位系统里,int的最大值为01111111 11111111 11111111 11111111,加1之后为


10000000   00000000   00000000   00000000。这个数是什么?


首先这是个负数-->负数在计算器里都是补码形式存放-->这是个补码-->那么真值


是?--> -2147483648(已知负数的补码求该负数,不会求的百度一下吧。。。)


(2)


对于unsigned,最大值(32个1)加1后最前面的1自然丢失,剩下32个0,所以就


是0。


结束。

版权问题 告我也没有办法 貌似是360doc
搜索更多相关主题的帖子: 文章 二进制 如何 网上 
2012-03-26 14:13
快速回复:关于补码的文章 自己(copy)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015978 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved