프로그래밍 언어/C++ 응용

[C/C++] unsigned와 signed의 값 비교 주의

서아랑😍 2022. 3. 23. 00:46

 

 

 

unsigned 자료형과 signed 자료형은 표현할 수 있는 범위가 다릅니다.

그래서 같은 자료형이라도 unsigned와 signed의 값을 비교할 때는 컴파일러에서 warning을 뱉어줍니다.


unsigned int uVal = 3;
int nVal = -1;

if (uVal > nVal)
{
    printf("unsigned 3 is bigger than signed -1\n");
}
else
{
    printf("signed -1 is bigger than unsigned 3\n");
}


어떤 결과를 보여줄까요?


출력 결과는 else문인 "signed -1 is bigger than unsigned 3"이 출력 됩니다.


통상적으로 uVal이 nVal보다 크다고 생각하겠지만 unsigned와 signed를 비교할 때는 둘 중 더 큰 범위인 unsigned로 변환되서 비교하기 때문에 unsigned int(3)과 unsigned int(-1)이 비교된 겁니다.

unsigned int에 음수 값이 들어가면 unsigned int max(4294967295)값이 들어가기 때문에 else문이 출력됐습니다.


위 값을 우리 눈에 보이는 그대로 출력하고 싶다면

if((int)uVal > nVal) 로 비교하면 됩니다. 그러면 첫번째 출력문이 출력될 것입니다.


gcc/g++, MSVC++ 컴파일러에서 모두 동일한 결과를 확인했습니다.