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보다 큰 쪽이므로 비교는 거짓입니다. 핵심은 비교 기호 자체보다 비교 전에 적용되는 형식 변환입니다.

중간 형식을 써서 비교를 다시 계산합니다

C11의 int와 unsigned int가 같은 순위인 경우
단계왼쪽 값오른쪽 값판단
원식-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 최댓값을 넘어가는 증가를 같은 방식으로 계산해 특정 값이 나온다고 말할 수는 없습니다.

값을 대입하기 전에 형식을 적습니다

  1. 각 상수의 형식을 확인합니다. 접미사 u는 해당 정수 상수를 unsigned 계열로 만듭니다.
  2. 정수 변환 규칙으로 비교 전에 결정되는 공통 형식을 찾습니다.
  3. 음수 변환이 있으면 unsigned의 범위에 따른 모듈러 값을 해석합니다.
  4. 변환을 마친 두 값을 비교하고 결과를 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의 동작을 뜻하지 않습니다.