2013-03-09 7 views
3
#include <iostream> 
#include <typeinfo> 

using namespace std; 

int main() 
{ 
    int s = 2; 
    unsigned int u = 3; 

    auto k = s + u; 

    if (typeid(k) == typeid(s)) 
     cout << "signed" << endl; 
    else if (typeid(k) == typeid(u)) 
     cout << "unsigned" << endl; 
    else 
     cout << "error" << endl; 
} 

GCC로이 프로그램의 출력은 다음과 같습니다C++ 11 유형 (부호 + 부호 없음)?

unsigned 

나는이 정의되지 않았거나 구현 정의 행동 중 하나입니다 확신합니다 -하지만 난 표준과 점을 연결 수없는 것.

표준에서 이것이 무엇이라고 말 할 수 있습니까?

+0

예,이 표준 동작입니다. 부호없는 유형은 동일한 크기의 서명 된 유형보다 "크다". – Mysticial

+0

왜 정의되지 않았거나 구현이 정의되었는지, 어떻게 될 것으로 예상됩니까? – ChiefTwoPencils

+1

'signed'와 'unsigned'로 동작 할 때,'unsigned'가 우선합니다. 나는이 사실에서 한 번 심각한 문제를 일으켰습니다 ... 수업은 인생에 대해 배웠습니다. –

답변

11

당신이보고있는 것은 Usual Arithmetic Conversions의 효과에 불과합니다.

§5 [expr] p7 : 비슷한 방법으로 연산 또는 열거 형 원인 변환 및 수율 결과 유형의 피연산자를 기대

많은 이항 연산자

이 표준은 다음을 말한다. 그 목적은 결과의 유형이기도 한 공통 유형을 산출하는 것입니다.

  • 가 [...]
  • 그렇지 적분 프로모션 (4.5) 모두 피연산자에 대해 수행되어야한다 : 다음과 같이 정의 된 패턴은 통상의 산술 전환이라고한다. 그러면 다음 규칙들은 승진 피연산자에 적용한다 :
    • 는 [...]
    • 그렇지 않으면 두 피연산자는 부호있는 정수 타입 피연산자의 형태에 대응하는 부호없는 정수 형태로 변환한다.
+0

고마워, 이것이 내가 찾고 있었던 것이다. –