long long的加法溢出情况

l o n g   l o n g long\ long long long的加法溢出情况:

l o n g   l o n g long\ long long long能储存的数据范围: [ − 2 63 , 2 63 − 1 ] [-2^{63},2^{63}-1] [263,2631]

1.当 a , b > 0 , a + b ≥ 2 63 a,b>0,a+b\geq2^{63} a,b>0,a+b263

a + b ∈ [ 2 63 , 2 64 − 2 ] a+b\in[2^{63},2^{64}-2] a+b[263,2642]

根据计算机的溢出处理规则:需要对最高位 2 64 2^{64} 264取模。

取模后变为: [ 2 63 , − 2 ] [2^{63},-2] [263,2]

但是 2 63 2^{63} 263在计算机会自动转为: − 2 63 -2^{63} 263

所以范围变为: [ − 2 63 , − 2 ] [-2^{63},-2] [263,2]

2.当 a < 0 , b < 0 , a + b ≥ 0 a<0,b<0,a+b\geq0 a<0,b<0,a+b0

a + b ∈ [ − 2 64 , − 2 63 − 1 ] a+b\in[-2^{64},-2^{63}-1] a+b[264,2631]

同样取模后变为: [ 0 , 2 63 − 1 ] [0,2^{63}-1] [0,2631]

3.其他情况不会溢出。

对应的 P A T PAT PAT 1065 A+B and C (64bit)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
int t;
int main(){
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
		ll a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		ll d=a+b;
		printf("Case #%d: ",i);
		if(a>0&&b>0&&d<0) puts("true");
		else if(a<0&&b<0&&d>=0) puts("false");
		else if(d>c) puts("true");
		else puts("false"); 
	}
	return 0;
}

值得注意的是: a + b a+b a+b这里先得用一个变量 l o n g   l o n g long\ long long long 储存起来,再与 c c c比较,不然会出错。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的Herio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值