两个正数之和为负数 则正溢出
两个负数之和为正数 则负溢出
正负溢出都可以包含零,因为在补码中,零有两种形式0000和1000都表示零。
但是在long long中,如果给的边界是[- 2 63 , 2 63 1 2^{63},2^{63}-1 263,2631],零一般放在负溢出中。
A,B最大取 2 63 1 2^{63}-1 2631 ,故A+B最大为 2 64 2 2^{64}-2 2642,最小为 2 63 2^{63} 263,则正溢出后值的区间为[- 2 63 , 2 2^{63},-2 263,2]
A,B最小取 2 63 -2^{63} 263,故A+B最小为 2 64 -2^{64} 264,最大为 2 63 1 -2^{63}-1 2631,或者为 2 63 -2^{63} 263开区间,则负溢出后值的区间为[0, 2 63 2^{63} 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;
}