다음 코드 조각을 고려하세요.
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; if (a < b) // warning C4018: '<' : signed/unsigned mismatch c = true; ... // Additional comparisons if (a == b) // no warning c = true; ... // Additional comparisons
서명된/서명되지 않은 정수 이해 불일치
C에서는 부호 있는 정수와 부호 없는 정수에 고유한 유형이 있으며 이를 직접 비교할 때(예: <, > 사용) MSVC는 경고를 표시합니다(C4018). 이는 컴파일러가 비교를 수행하기 전에 두 피연산자를 공통 유형으로 승격시키려고 하기 때문입니다.
승격 규칙
정수 비교의 경우 MSVC는 "일반적인 산술"을 따릅니다. 변환' 규칙은 C 표준에 정의되어 있습니다. 다음 규칙은 비교 전에 어떤 승격이 발생하는지 결정합니다.
a == b에 대해 왜 경고가 없나요?
예제에서 ==를 사용하여 a와 b를 비교할 때 MSVC는 경고를 발행하지 않습니다. 비교 전에 두 피연산자가 모두 unsigned int로 변환되기 때문입니다. a와 b의 값이 모두 양수이므로 부호/부호 불일치가 없으며 결과가 정확합니다.
직관적 결과와 비직관적 결과
반면 a == b에 대한 경고가 없다는 것은 직관적으로 보일 수 있지만 a < 비. 이 경우 a를 unsigned로 변환하면 더 큰 값이 생성되어 비교 결과에 영향을 줍니다. 따라서 MSVC는 부호 있는/부호 없는 비교와 관련된 잠재적인 문제를 강조하기 위해 경고를 발행합니다.
결론
MSVC는 a == b에 대해 경고를 발행하지 않습니다. 변환을 수행하면 두 피연산자가 모두 동일한 부호 없는 유형으로 변환되어 부호 있는/부호 없는 불일치가 제거됩니다. 그러나 < 또는 > 변환으로 인해 예상치 못한 결과가 발생할 가능성이 있으므로 컴파일러에서 경고해야 합니다.
위 내용은 MSVC가 서명/서명되지 않은 비교에 대해 어떤 경우에는 경고하지만 다른 경우에는 경고하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!