C에서 -1 < 1u는 거짓입니다. 1u는 unsigned int이고 두 피연산자의 정수 변환 규칙에 따라 -1도 unsigned int로 변환됩니다. 이 변환은 해당 부호 없는 형식의 범위에서 모듈러 연산으로 이뤄져 큰 unsigned 값이 되므로 1보다 작지 않습니다.
이 결과는 signed overflow 예시가 아닙니다. 부호 없는 정수의 변환과 증가에는 모듈러 규칙이 적용되지만, 이를 signed 정수의 overflow가 안전하다는 뜻으로 넓혀 해석하면 안 됩니다.
비교 전에 두 피연산자의 공통 형식을 결정합니다
-1은 보통 int 형식의 정수 상수이고 1u는 unsigned int입니다. 비교 연산자는 먼저 두 정수 피연산자를 공통 형식으로 변환합니다. 이 사례에서 두 형식의 순위가 같고 int가 unsigned int의 모든 값을 표현할 수 없으므로, -1이 unsigned int로 변환됩니다. 이 변환에서 음수는 unsigned 범위의 크기를 주기로 하는 모듈러 결과가 됩니다. 변환된 값은 1보다 큰 쪽이므로 비교는 거짓입니다. 핵심은 비교 기호 자체보다 비교 전에 적용되는 형식 변환입니다.
중간 형식을 써서 비교를 다시 계산합니다
| 단계 | 왼쪽 값 | 오른쪽 값 | 판단 |
|---|---|---|---|
| 원식 | -1 (int) | 1u (unsigned int) | 변환 전 |
| 변환 뒤 | UINT_MAX (unsigned int) | 1u (unsigned int) | 왼쪽 값이 큼 |
| 관계 결과 | -1 < 1u | 거짓 | 논리 결과 0 |
표는 특정 시스템의 UINT_MAX 숫자를 고정하지 않습니다. C 구현에서 unsigned 범위가 다를 수 있지만, 음수의 unsigned 변환은 그 형식의 모듈러 범위로 대응되고 최종 비교는 이 조건에서 거짓입니다. 관련한 또 다른 안전한 계산은 unsigned int n = UINT_MAX; n++;입니다. unsigned 증가 결과는 다시 0이 됩니다. 반면 signed 최댓값을 넘어가는 증가를 같은 방식으로 계산해 특정 값이 나온다고 말할 수는 없습니다.
값을 대입하기 전에 형식을 적습니다
- 각 상수의 형식을 확인합니다. 접미사 u는 해당 정수 상수를 unsigned 계열로 만듭니다.
- 정수 변환 규칙으로 비교 전에 결정되는 공통 형식을 찾습니다.
- 음수 변환이 있으면 unsigned의 범위에 따른 모듈러 값을 해석합니다.
- 변환을 마친 두 값을 비교하고 결과를 0 또는 1로 기록합니다.
큰 unsigned 값을 음수처럼 읽지 않습니다
-1이라는 표기를 보고 모든 비교에서 가장 작은 수라고 판단하면 함정에 빠집니다. 비교식 안에서 피연산자 형식이 달라지면 값이 먼저 변환될 수 있습니다. 반대로 unsigned 값은 수학적 음수라고 부르는 값이 아니라 0부터 해당 형식의 최댓값까지인 정수입니다. 여기서 -1의 변환 결과를 설명할 때만 수학적 음수와 모듈러 계산의 관계를 이용합니다. signed overflow 규칙을 끌어와 결과를 예측하지 말고, 자료형과 변환을 분리해 계산하세요.
이 사례에서는 같은 순위의 int가 unsigned int 전체 범위를 표현하지 못하므로 공통 형식 변환 뒤 비교는 unsigned 형식에서 이뤄집니다. 음수를 unsigned로 바꾸는 결과는 해당 형식의 범위를 주기로 한 모듈러 값이며, -1은 UINT_MAX에 대응합니다. 그래서 -1 < 1u는 거짓이고 -1 > 1u는 참입니다. 이 설명은 int와 unsigned int가 쓰인 이 식의 변환을 다룹니다. 다른 순위나 폭을 가진 정수 형식의 모든 조합을 한 사례로 외우지 말고, 각 피연산자의 선언과 변환 순서를 다시 확인하세요.
정답을 가리고 확인해 보세요
이 글을 위해 만든 학습 예시이며 공식 기출문제나 판매 카드의 인용이 아닙니다.
C의 -1 < 1u는 참인가요? 비교 전에 어떤 변환이 적용되나요?
정답과 해설 확인
거짓입니다. -1이 unsigned int로 변환되어 unsigned 값 1보다 커집니다.C11 정수 승격과 통상 산술 변환 규칙을 적용합니다. 이는 이 형식 조합에 대한 결과이며 signed overflow의 동작을 뜻하지 않습니다.