2016-07-22 2 views
-1

내가 caspp을 읽을 때, overflow.so없이 인수를 추가 할 수 있는지 여부를 결정하는 질문이 있습니다. 코드를 씁니다."long long = int + int"먼저 계산 후 입력 하시겠습니까?

//sum1 is long long ,so there is no overflow. 
//when sum2 is overflow ,then sum1 != sum2; 
int tadd_ok (int x,int y) 
{ 
long long int sum1 = x + y; 
int sum2 = x + y; 
return sum1 == sum2; 
} 

그러나 몇 가지 질문이 있습니다. x = -2147483647, y = -2라고 가정하면 sum1과 sum2가 모두 같음 2147483747 (오버플로!).

그리고 "long long = int + int"에 대해 먼저 계산 한 다음 유형을 변환 하시겠습니까? 이 규칙은 무엇입니까?

+0

식을 평가하고, 나중에 할당. 모든 피연산자가'int' 인 한, 표현식은'int'로 평가됩니다. 게시 된 코드에서'int sum2 = x + y;'는'int sum2 = (int) sum1;'과 같습니다. – dxiv

+4

C 및 C++ 표준 문서는 일반적인 판촉 및 변환시 명확합니다. 문제는 중간 크기의 합계가 적절한 크기 일 것이지만 두 개의 'int'유형을 추가하기 때문에 해당 변환이 보존되지 않습니다. 결과가 오랫동안 당신에게 올 것이라고 가정하기보다는 추가를 캐스팅해야합니다. –

+1

'C'와'C++ '는 별개의 언어입니다. – sjsam

답변

3

주된 목적

에서
long long int sum1 = x + y; 

는 식 x + y을 평가하는 것입니다.
;은 해당 지점에 도달 할 때 표현식의 부작용이 수행되어야 함을 의미하는 시퀀스 지점입니다.
여기에 부작용 x + y

ISO/IEC 9899에 sum1 식의 값을 할당하는 것이다 201x-> 6.3.1.8-> 1 개 상태 :

달리 명시되지 않는 한 sstated 공통 실제 유형은 결과의 실제 유형 인 입니다.

그렇지 않으면 정수 승격이 두 피연산자에 대해 수행됩니다. 그런 다음 규칙이 승격 된 피연산자에 적용됩니다.
- 두 피연산자 모두 동일한 유형 인 경우 더 이상 변환 할 필요가 없습니다.
- 두 피연산자 모두 부호가있는 정수 유형이거나 부호가없는 경우 정수 유형 인 경우 더 낮은 정수 변환 순위 유형의 피연산자는 더 높은 순위를 갖는 피연산자 유형으로 변환 된 입니다. 당신이 원하는 무엇

먼저,

long long int sum1 = (long long int)x + y; // Casting x to LL causes y to be auto-converted 
+0

대단히 감사합니다! –