2015-01-25 7 views
1

"일반적인 산술 변환"과 "정수 프로모션"은 같은 것입니까? 나는 "일반적인 산술 변환"을 사용하여 표현식의 피연산자를 동일한 유형으로 만드는 반면 "정수 판촉"은 int에서 int까지 유형을 승격시키는 데 사용되지만, MSDN에서는 두 개념이 모두 아래에 배치된다는 점을 읽었습니다. "일반적인 산술 변환"."일반적인 산술 변환"과 "정수 프로모션"은 같은 것입니까?

+0

왜 코드로 형식을 지정하지 않습니까 ?? –

+1

* 일반적인 산술 변환 *은 정수형 프로모션 * 이상의 기능을 수행 할 수 있습니다. 한 가지는 부동 소수점 값을 승격시킬 수 있습니다 (예 :'float'에서'double'). 다른 하나는 부호있는 값을 부호없는 유형으로 변환 할 수 있습니다. 전체 사양은 ** [expr]/9 **이며 꽤 길다. –

+2

_one_ 언어를 선택하십시오. C와 C++은 다른 언어입니다. –

답변

5

번호

특정 상황에서 통합 촉진을 포함하지만, 이러한 두 개의 별도의 메커니즘입니다일반적인 산술 변환 : 산술 또는 열거 타입의 피연산자를 기대

[C++14: 5/10]: 많은 이항 연산자 유사한 방식으로 변환을 수행하고 결과 유형을 생성합니다. 그 목적은 결과의 유형이기도 한 공통 유형을 산출하는 것입니다. 다음 이 패턴 정의 된 일반적인 산술 변환 를 호출 : 피연산자 범위는 열거 형 (7.2)이다

  • 경우에는 변환이 수행되지 않는다; 다른 피연산자가 같은 유형을 가지지 않으면 표현식이 잘못 형성됩니다.
  • 피연산자 중 하나가 long double 유형 인 경우 다른 피연산자는 long double으로 변환됩니다.
  • 그렇지 않으면 피연산자 중 하나가 double이면 다른 하나는 double으로 변환됩니다.
  • 그렇지 않으면 피연산자가 float 인 경우 다른 피연산자는 float으로 변환됩니다.
  • 그렇지 않은 경우 정수 피쳐 (4.5)는 피연산자 모두에서으로 수행됩니다. 다음은 승격 된 피연산자에 적용되는 규칙입니다.
    • 두 피연산자 모두 동일한 유형 인 경우 더 이상 변환 할 필요가 없습니다.
    • 그렇지 않으면 두 피연산자 모두 부호있는 정수 유형을 갖고 있거나 둘 다 부호없는 정수 유형을 갖는 경우 더 낮은 정수 변환 순위 유형의 피연산자는 더 높은 순위의 피연산자 유형으로 변환됩니다.
    • 부호없는 정수 유형을 갖는 피연산자가 다른 피연산자 유형의 순위보다 크거나 같은 경우 부호있는 정수 유형의 피연산자는 부호없는 정수 유형의 피연산자 유형으로 변환되어야합니다.
    • 부호없는 정수 유형을 갖는 피연산자의 유형이 부호없는 정수 유형을 갖는 피연산자 유형의 모든 값을 나타낼 수있는 경우 부호없는 정수 유형의 피연산자는 부호가있는 정수가있는 피연산자의 유형으로 변환되어야합니다 유형.
    • 그렇지 않으면 두 피연산자 모두 부호가있는 정수 유형의 피연산자 유형에 해당하는 부호없는 정수 유형으로 변환되어야합니다.

문구 훨씬 C11에서 동일합니다.

일반적인 프로모션은 일반적인 산술 변환과 관련이없는 상황에서 수행 될 수 있습니다. 비트 시프트의 LHS 피연산자; 궁극적으로 두 가지 메커니즘이 각각 고유 한 이름을 갖는 이유입니다.

+0

"두 피연산자가 같은 유형이라면 더 이상 변환 할 필요가 없습니다."그래서 만약 두 피연산자가'short' 타입이라면'int'로 승격되지 않을까요? – John

+0

@ 존. 그것은 그것이 말하는 것이 아닙니다. "** 통합 프로모션 (4.5)은 두 피연산자 모두에서 수행되어야합니다 .61 ** 그런 다음 ** 다음 규칙이 승격 피연산자에 적용됩니다. 두 피연산자 모두 동일한 유형 인 경우 더 이상 변환 할 필요가 없습니다."* 당신은 완전한 프로모션의 효과를 무시하고 있습니다. –

+0

MSDN 기사에서 "정수 변환"단계는 피연산자가 항상 같은 형식으로 끝나야한다는 것을 보여줍니다. 즉, 같은 형식의 피연산자를 모두 만드는 "정수 변환"이 아닙니다. (나는 "필수 변환"과 "통합 프로모션"이 같은 것으로 가정 함). – John