long long的加法溢位情況

Harris-H發表於2020-10-13

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比較,不然會出錯。

相關文章