两个正数之和为负数 则正溢出
两个负数之和为正数 则负溢出
正负溢出都可以包含零,因为在补码中,零有两种形式0000和1000都表示零。
但是在long long中,如果给的边界是[- 263,263−1],零一般放在负溢出中。
A,B最大取 263−1 ,故A+B最大为 264−2,最小为 263,则正溢出后值的区间为[- 263,−2]
A,B最小取 −263,故A+B最小为 −264,最大为 −263−1,或者为 −263开区间,则负溢出后值的区间为[0, 263)
#include <cstdio>
typedef long long LL;
int main(){
LL a,b,c;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&a,&b,&c);
printf("Case #%d: ",i);
LL tmp = a+b;
int flag;
//两个正数之和为负数 则正溢出
if(a>0&&b>0&&tmp<0) flag=1;
//两个负数之和为正数 则负溢出
else if(a<0&& b<0 && tmp >0) flag=0;
else if(tmp > c) flag=1;
else flag=0;
if(flag) printf("true\n");
else printf("false\n");
}
return 0;
}