"일반적인 산술 변환"과 "정수 프로모션"은 같은 것입니까? 나는 "일반적인 산술 변환"을 사용하여 표현식의 피연산자를 동일한 유형으로 만드는 반면 "정수 판촉"은 int
에서 int
까지 유형을 승격시키는 데 사용되지만, MSDN에서는 두 개념이 모두 아래에 배치된다는 점을 읽었습니다. "일반적인 산술 변환"."일반적인 산술 변환"과 "정수 프로모션"은 같은 것입니까?
답변
번호
특정 상황에서 통합 촉진을 포함하지만, 이러한 두 개의 별도의 메커니즘입니다일반적인 산술 변환 : 산술 또는 열거 타입의 피연산자를 기대
[C++14: 5/10]:
많은 이항 연산자 유사한 방식으로 변환을 수행하고 결과 유형을 생성합니다. 그 목적은 결과의 유형이기도 한 공통 유형을 산출하는 것입니다. 다음 이 패턴 정의 된 일반적인 산술 변환 를 호출 : 피연산자 범위는 열거 형 (7.2)이다
- 경우에는 변환이 수행되지 않는다; 다른 피연산자가 같은 유형을 가지지 않으면 표현식이 잘못 형성됩니다.
- 피연산자 중 하나가
long double
유형 인 경우 다른 피연산자는long double
으로 변환됩니다.- 그렇지 않으면 피연산자 중 하나가
double
이면 다른 하나는double
으로 변환됩니다.- 그렇지 않으면 피연산자가
float
인 경우 다른 피연산자는float
으로 변환됩니다.- 그렇지 않은 경우 정수 피쳐 (4.5)는 피연산자 모두에서으로 수행됩니다. 다음은 승격 된 피연산자에 적용되는 규칙입니다.
- 두 피연산자 모두 동일한 유형 인 경우 더 이상 변환 할 필요가 없습니다.
- 그렇지 않으면 두 피연산자 모두 부호있는 정수 유형을 갖고 있거나 둘 다 부호없는 정수 유형을 갖는 경우 더 낮은 정수 변환 순위 유형의 피연산자는 더 높은 순위의 피연산자 유형으로 변환됩니다.
- 부호없는 정수 유형을 갖는 피연산자가 다른 피연산자 유형의 순위보다 크거나 같은 경우 부호있는 정수 유형의 피연산자는 부호없는 정수 유형의 피연산자 유형으로 변환되어야합니다.
- 부호없는 정수 유형을 갖는 피연산자의 유형이 부호없는 정수 유형을 갖는 피연산자 유형의 모든 값을 나타낼 수있는 경우 부호없는 정수 유형의 피연산자는 부호가있는 정수가있는 피연산자의 유형으로 변환되어야합니다 유형.
- 그렇지 않으면 두 피연산자 모두 부호가있는 정수 유형의 피연산자 유형에 해당하는 부호없는 정수 유형으로 변환되어야합니다.
문구 훨씬 C11에서 동일합니다.
일반적인 프로모션은 일반적인 산술 변환과 관련이없는 상황에서 수행 될 수 있습니다. 비트 시프트의 LHS 피연산자; 궁극적으로 두 가지 메커니즘이 각각 고유 한 이름을 갖는 이유입니다.
"두 피연산자가 같은 유형이라면 더 이상 변환 할 필요가 없습니다."그래서 만약 두 피연산자가'short' 타입이라면'int'로 승격되지 않을까요? – John
@ 존. 그것은 그것이 말하는 것이 아닙니다. "** 통합 프로모션 (4.5)은 두 피연산자 모두에서 수행되어야합니다 .61 ** 그런 다음 ** 다음 규칙이 승격 피연산자에 적용됩니다. 두 피연산자 모두 동일한 유형 인 경우 더 이상 변환 할 필요가 없습니다."* 당신은 완전한 프로모션의 효과를 무시하고 있습니다. –
MSDN 기사에서 "정수 변환"단계는 피연산자가 항상 같은 형식으로 끝나야한다는 것을 보여줍니다. 즉, 같은 형식의 피연산자를 모두 만드는 "정수 변환"이 아닙니다. (나는 "필수 변환"과 "통합 프로모션"이 같은 것으로 가정 함). – John
왜 코드로 형식을 지정하지 않습니까 ?? –
* 일반적인 산술 변환 *은 정수형 프로모션 * 이상의 기능을 수행 할 수 있습니다. 한 가지는 부동 소수점 값을 승격시킬 수 있습니다 (예 :'float'에서'double'). 다른 하나는 부호있는 값을 부호없는 유형으로 변환 할 수 있습니다. 전체 사양은 ** [expr]/9 **이며 꽤 길다. –
_one_ 언어를 선택하십시오. C와 C++은 다른 언어입니다. –