본문 바로가기

공부기록/C, C++

[gcc warning] comparison is always true due to limited range of data type

32bit unsigned int 범위의 정수에 대해 (0과 1은 제외하고, $2$ 부터 $ {2} ^ {32} -1 $까지에 대하여) 소인수분해를 하는 프로그램을 짜던 중

 

아래의 코드에서 다음과 같은 경고가 발생했다.

unsigned int	num;

num = 0;

if (!(num >= 2 && num <= 4294967295))
{
	printf("Out of range.\n");
    return (0);
}

[경고] comparison is always true due to limited range of data type.

 

[원인]

직접 입력해준 unsigned int 형의 최댓값인 ${2}^{32} - 1 $ = 4,294,967,295 에 마우스를 올려보니

컴파일러가 8byte long 형으로 인식하고 있었다. 

unsigned int 는 4 byte

long 은 8 byte 이므로,

unsigned int 형 변수 num에 4,294,967,295보다 큰 수가 들어오면 오버플로우 되어 0이 된다.

따라서 num에 어떤 수가 들어와도 4,294,967,295 보다 작다는 결과가 나오는 것이다.

 

[해결] 

숫자 4,294,967,295를 강제형변환 해 unsigned int형으로 만든 후 비교했더니 경고메시지가 더이상 나타나지 않았다.

if (!(num >= 2 && num <= (unsigned int)4294967295))
{
	printf("Out of range.\n");
	return (0);
}