2012-05-02 5 views
0

난 그냥 프로그래밍 퍼즐을했습니다. 왜 똑같습니까?두 변수의 비교

#include <stdio.h> 
#include <limits.h> 

int main(int argc, char *argv[]) 
{ 
    unsigned int x = ULONG_MAX; 
    char y = -1; 
    if (x == y) printf("That is same."); 

    return 0; 
} 

부호없는 int가 부호있는 char로 변환되므로 -1이됩니다. 서명 된 유형과 서명되지 않은 유형을 비교하는 표준이 될 수 있습니다. 모르겠다 ...

+2

이 숙제가 있습니까? 그렇다면 [tag : 숙제] 태그를 사용하십시오. –

+0

아니요. ;-) – RePRO

+0

이 http://stackoverflow.com/questions/6636793/what-are-the-general-rules-for-comparing-different-data-types-in-c –

답변

2

signed charunsigned int 사이의 tiff에서 unsigned int이 우승합니다!

그 다음이

Size does matter

-1ULONG_MAX이며 따라서 if() 조건이 참 unsigned int 변환하고자한다.

C에서는 크기가 중요합니다. 변수는 항상 변수 중에서 가장 큰 크기로 변환됩니다.

+0

완벽을 기하기 위해 :'y'는 서명 된'char'이므로 값은'unsigned int '로 부호 확장되어'ULONG_MAX'와 정확히 일치하는'11 ... 11'을 얻습니다 . –

+0

값이 -1과 -1이됩니다. 왜? – RePRO

+0

@RePRO 'printf'' % d'을 사용하여 값을 인쇄한다고 생각합니다. 그래서'-1'이 보입니다. '% d'은 그 값을 부호있는 정수로 해석하여'ULONG_MAX'를'-1'로 변환합니다. 숫자 표현은 동일하지만 해석은 다릅니다. '=='는'unsigned int'를 선호하지만'% d'는'signed int'를 선호합니다 –

1

몇 년 전에 저는 두 가지를 배웠습니다. 그 중 하나는 유형과 비교되었습니다. unsigned int의 값이 sizeof char보다 큰 경우

은 내가 charunsigned int로 캐스팅 된 것 중 하나. 또는 unsigned int의 값을 sizeof char으로 제한하려면 다른 방법으로 전송하십시오. 그런 식으로 컴파일러에게 값을 비교하는 방법을 알려주고, 유지 보수 자들에게도 도움이 될 것입니다.