C语言中,判断a+b与c的大小,if(a+b > c)为什么会判断错误?

问题:现定义long long a,b,c ,比较a+b与c 的大小关系,原代码如下:

#include<stdio.h>
int main(){
    int T,i = 1;
    long long a,b,c,res;
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld%lld",&a,&b,&c);
        printf("a+b:%lld\n",a + b);
        
        //需要把a+b放入res中再与c比较,否则会出现错误,为什么?
        res = a+b;
        if(a > 0 && b > 0 && res < 0)
            printf("Case #%d: true\n",i);
        else if(a < 0 && b < 0 && res >= 0)
            printf("Case #%d: false\n",i);
        else if(res > c)
            printf("Case #%d: true\n",i);
        else 
            printf("Case #%d: false\n",i);
        i++;
    }
}

要像上面这样写才可以,如果if中的判断条件不用res,而是直接用a+b和c比较,比如写成if( a+b >c),在某些情况下判断出错,想请教大家在什么情况下以及为什么会这样?

阅读 7.5k
1 个回答

a + b的和过大时,发生溢出了,这里的long long 就是signed long long,溢出之后,按照long long的位数截断,然后再变成十进制数,就可能出现变成负数的情况啊,然后就出错了吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进