2017-10-16 23 views
-2

우리는 signed와 unsigned를 비교할 때 부호있는 값을 부호없는 값으로 변환하고 int를 short와 비교할 때 컴파일러가 더 작은 값을 더 큰 값으로 변환한다는 것을 알고 있습니다. 그러나 서명 된 int x = 0xdeadbeef와 unsigned short y = 0xffff를 비교 한 다음 unsigned short를 int로 변환 한 후 x의 부호없는 값보다 작아야 비교시 y가 0x0000ffff가되어야하는지 확인하기 위해이 코드를 작성했습니다. 하지만 내 코드는 x가 y보다 큰 if 조건으로 들어 가지 않습니다. 누군가 나에게 설명 할 수 있을까요?signed int와 unsigned short의 비교 ++

코드 스 니펫 :

"X가 크다"고 인쇄되지 않는 코드를 실행
#include<iostream> 
using namespace std; 

int main(){ 

     unsigned int x=0xDEADBEEF; 
     unsigned short y= 0xFFFF; 

     if((signed)x > y) 
       cout<<"X is larger"<<endl; 

    return 0; 
} 

.

+0

(부호가있는) x가 음수이기 때문입니다. – cleblanc

+0

하지만 서명되지 않은 서명자와 비교할 때 컴파일러가 부호없는 서명으로 다시 변환하면 안됩니까? –

+0

btw 코드는 ** C++ ** –

답변

0

x을 부호없는에서 부호가있는 형식으로 입력하면 정수가 오버플로됩니다. signed intunsigned int보다 작은 양수 값을 유지할 수 있습니다. 따라서 정수 오버플로가 발생하면 대부분의 플랫폼에서 자동차의 주행 기록처럼 작동합니다. 즉, 일단 int 값이 저장할 수있는 최대 값을 초과하면 처음부터 시작됩니다. 32 비트 시스템 (int32)에서 부호있는 int의 경우 '시작'은 -2,147,483,648이됩니다.

귀하의 경우 x는 0xDEADBEEF 또는 3,735,928,559입니다. 32 비트 시스템의 부호없는 int는이 값을 저장할 수 있습니다. 그러나 signed에 캐스트 될 때 오버플로가 발생하므로 위의 규칙이 적용되어 해당 값이 -1,588,444,912로 변환됩니다. 그것이 음수이기 때문에, if 진술 문은 만족스럽지 않으므로 명세서가 인쇄되지 않습니다.