C语言intmin的用法,c语言中intmin的一些问题(2页)-原创力文档

二进制补码(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语言的头文件里面看到(Code::Blocks的gcc编译器):版权文档,请勿用做商业用途

#define INT_MAX ? ? ? ?2147483647

#define INT_MIN ? ? ??(-INT_MAX-1)

所以,最小的整形数数值是-2147483648。他的相反数就是2147483648,但是这个正数是溢出的,整形数的范围是在INT_MIN到INT_MAX之间。版权文档,请勿用做商业用途

如果在gcc下面运行(n=-n),会产生什么结果呢?请看下面的程序:

#include

#include

int main(){

int i = INT_MIN;

printf("%d",-i);

return 0;}

返回结果是:-2147483648。这个结果令人意外。

参照CSAPP的2.3.3节,我们可以认为上面的结果是有负溢出产生的。负溢出指的是,当两个负数相加的时候,如果因为溢出而导致结果是0或者正数。版权文档,请勿用做商业用途

按照这个加法原理,INT_MIN+INT_MIN=0。

如果从二进制代码的角度考虑,比如两个8位数相加:

?+=100000000

由于结果超出了8位,这时候第九位会被截去,结果就是0。

另一个可能出现的问题就是C编辑器可能进行了一个不良优化。有位童鞋已经发现了这个问题: /forums/t676142-int_min-1-0-equals-to-0-a.html版权文档,请勿用做商业用途

#include #include 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=2147483647, cmp=0版权文档,请勿用做商业用途

由于j是正数,正常理解i-1也应该是大于零的。在我的gcc编译器里面也确实是这样。

但是某些编译器却把i-1>0,优化为i>1,导致了结果不同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值