2013-11-25 7 views
1

8 비트 값을 16 비트 값과 비교할 때 어떤 일이 발생하는지 궁금합니다.은 8 비트 값과 16 비트 값을 비교합니다.

내가 코드 예제에 의한 문제를 설명하려고합니다 :

bool result; 
unsigned char a_8bit = 0xcd; 
unsigned short b_16bit = 0xabcd; 
result = a_8bit < b_16bit; 

가능한 결과가 될 수 있습니다

  • a_8bit는 암시 적으로 서명되지 않은 짧은에 주조 및 16 비트 값으로 b_16bit을 비교한다 . 결과는 참
  • b_16bit는 암시 적으로 부호없는 char에 캐스트되고 8 비트 값인 a_8bit와 비교됩니다. 결과가 false입니다.

컴파일러가이 코드를 사용하여 수행하는 작업에 대한 단서가 있습니까? 물론, 나는 그것을 시험해 볼 수 있지만이 코드의 다른 컴파일러에 의해 다른 해석이 있습니까?

+0

). 둘 다 정수로 변환됩니다. 그리고 bool에 주조했다. 하지만 int의 크기는 구현이 정의되어 있습니다 –

+0

@Koushik 'bool'에는 캐스트가 없습니다. '<'의 결과는 이미'bool' 타입입니다. –

답변

2

1 BOOL, char16_t, char32_t 또는 그 정수 변환 계수의 wchar_t (4.13) 이외 정수형의 prvalue int 형의 prvalue로 전환시킬 수있다 INT의 랭크 미만이면 INT 소스 유형의 모든 값을 나타낼 수 있습니다. 그렇지 않으면 소스 prvalue가 unsigned int 유형의 prvalue로 변환 될 수 있습니다. [§ 4.5]

따라서 컴파일러는 두 가지 모두를 unsigned int으로 승격 한 다음 비교할 수 있습니다.

+0

int는 양쪽 피연산자의 값을 나타낼 수 있기 때문에 int가 아닌가? –

+0

컴파일러는 'unsigned int'와 'unsigned short'중에서 둘을 선택할 수 있기 때문에 두 가지 값을 나타낼 수 있지만 표준은 'int'에 대해 더 구체적입니다. – deepmax

+0

@MM. _IF_ int의 크기가 short의 크기보다 큽니다. 하지만 전형적인 32 (또는 64) 비트 머신에서는 그렇습니다. 비교 전에 둘 다'int'로 변환됩니다. –

1

첫 번째는 정확한 것이지만 둘 다 부호없는 것으로 변환 된 다음 비교됩니다.

관련 문제