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);
}
'공부기록 > C, C++' 카테고리의 다른 글
[BOJ] 기타 입출력 문제 C++ (0) | 2020.10.24 |
---|---|
[BOJ] 입출력 A+B 문제 C++ (0) | 2020.10.18 |
[C++] 포인터 대신 참조자(reference)를 써야하는 경우는 ? (0) | 2020.07.11 |
[C] 이중포인터의 선언, 할당, 참조 이해하기 (0) | 2020.06.12 |
C와 Python의 음수 나머지 연산 방법의 차이 (0) | 2020.04.24 |