[C++] unsigned and signed

int _tmain(int argc, _TCHAR* argv[])
{
	int a	       = -3;
	unsigned int b = 2;

	if ( b + a < 0)
	{
		cout<<"hello"<<endl;
	}
	else
	{
		cout<<"world"<<endl;
	}
	return 0;
}

무조건 world 가 출력된다. vs2010 에서는 warning level 4 설정을 하더라도 경고는 출력되지 않는다. 언어의 명세라서 경고에 넣지 않은 듯. (명세 이름이 암시적 타입 변환이라니 OTL ‘명세’와 ‘암시’는 안 어울린다고…) a 가 unsigned int 로 promotion 되는 것이 원인.

위의 문제는 잘 들어나지 않다가 약간의 수정으로 발생할 수 있다. 6번 라인이 원래 b + a == -1 였다면 기대한 대로 hello 가 출력된다.

좀 더 자세한 것은 The C++ Programming Language 부록 C 6.1, C 6.3 을 보자. C의 경우는 C99 Standard 6.3.1.8을 보자.

유사한 디버깅 사례로 민장님 블로그1를 참고하자.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다