Java Fly

Java&Oracle
随笔 - 12, 文章 - 20, 评论 - 27, 引用 - 0
数据加载中……

补码的原理及随想

补码的原理及随想 - [笔记]

越早在课堂上学的东西,越给我以简单的印象,忘得也越快。而事实上,它们往往是最富有智慧的,即便在我没忘的时候,也没有深刻地理解它们。

嘛是补码?不少书上扯一堆“取反加1之类的规则,很不着重点,我觉得核心在于:

对于范围为[0,M)的整数计量系统,其模为M。和为M的两个数互为补数。

如果有两个整数a,b[0, M),那么f(a-b)==f(a+c),其中c= M-b,是b的补码,f是一个映射,定义为:
0<=x< M,f(x)=x;
x>= M,f(x)=x % M;
x<0,f(x)=f(M +x).
其中%为取余运算(效果同编程语言中的取模运算)

在计算机中,f是由溢出隐式实现的,所以天生就有a-b==a+c。这就把减运算转化成了加运算。

于是,为了便于执行减运算,计算机就把-b表示为其补码c

假设机器字有n位,那么M=2nc=2n-b

人在纸上怎么计算2n-b的二进制值?2n的原码就是1后面跟了n0,直接用它减b的原码不方便,先用2n-1的原码(n1)减b的原码,得到的结果加上1就是2n-b的值了——这就是“取反加1的由来。

posted on 2007-11-01 10:18 Java Fly 阅读(1929) 评论(4)  编辑  收藏

评论

# re: 补码的原理及随想  回复  更多评论   

知其然,知其所以然,这种学习态度值得学习.
2007-11-12 18:19 | 紫苏

# re: 补码的原理及随想[未登录]  回复  更多评论   

为什么好多教材都没有提到模的概念,都是取反加1 这不是糊弄大家吗?
2008-01-10 11:52 | fox

# re: 补码的原理及随想[未登录]  回复  更多评论   

当x<0时,f(x)=f(M-(-x)%M). 这样才对吧。
因为M+x仍有可能为复数。
2008-09-22 23:12 | Tony

# re: 补码的原理及随想  回复  更多评论   

也许我们两个所表达的关于补码的理念应该结合一下,这样会更加完善啊
呵呵,欢迎讨论啊
http://blog.chinaunix.net/u2/86948/showart_1849617.html
2009-03-11 00:40 | caocao

只有注册用户登录后才能发表评论。


网站导航: