pdffactory pro下载怎么找回已保存的会话

C语言中INT_MIN的一些问题
二进制补码(Two's complement)表示法在进行数据表达和运算的时候,都非常直观和快捷(详细可以看Computer System A Programmer's Perspective CSAPP)。但是进行某些计算或者编程的时候一定要非常小心,因为表示在数的上下限处,往往会出现意料之外的情况。K.R. 的C语言书"The C Programming Languages"就顺带提到了这个问题,在Exercise 3-4处,问到问什么INT_MIN 在前面的一个程序中无法被正确表达。有趣的是程序里面的这一句:if ((sign=n)&0)&n=-n;在32位计算机中,最小的整形数可以在C语言的头文件&limits.h&里面看到(Code::Blocks的gcc编译器):#define INT_MAX & & & &#define INT_MIN & & & (-INT_MAX-1)所以,最小的整形数数值是-。他的相反数就是,但是这个正数是溢出的,整形数的范围是在INT_MIN到INT_MAX之间。如果在gcc下面运行(n=-n),会产生什么结果呢?请看下面的程序:#include &stdio.h&#include &limits.h&int main(){int i = INT_MIN;printf("%d",-i);return 0;}返回结果是:-。这个结果令人意外。参照CSAPP的2.3.3节,我们可以认为上面的结果是有负溢出产生的。负溢出指的是,当两个负数相加的时候,如果因为溢出而导致结果是0或者正数。按照这个加法原理,INT_MIN+INT_MIN=0。如果从二进制代码的角度考虑,比如两个8位数相加:& + =由于结果超出了8位,这时候第九位会被截去,结果就是0。另一个可能出现的问题就是C编辑器可能进行了一个不良优化。有位童鞋已经发现了这个问题:/forums/t676142-int_min-1-0-equals-to-0-a.html#include &stdio.h&#include &limits.h&int main(){int i = INT_MIN;int j = i-1;int cmp = ((i-1)&0);printf("j=%d, cmp=%d", j, cmp);return 0;}$ j=, cmp=0由于j是正数,正常理解i-1也应该是大于零的。在我的gcc编译器里面也确实是这样。但是某些编译器却把i-1&0,优化为i&1,导致了结果不同。
TA的推荐TA的最新馆藏[转]&本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 pdffactory pro 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信