더북(TheBook)

정수 타입에 대한 값의 범위에서 경계값을 포함하지 않기 때문에 부호 있는 값과 부호 없는 값이 섞인 연산에서 타입을 결정하는 과정은 상당히 복잡하다.

-1   < 0    // 참. 문제 없음. 부호는 동일
-1L  < 0    // 참. 문제 없음. 부호는 동일
-1U  < 0U   // 참. 문제 없음. 부호는 동일
-1   < 0U   // 거짓. 위험. 부호가 뒤섞임
-1U  < 0    // 거짓. 위험. 부호가 뒤섞임
-1L  < 0U   // 상황에 따라 참일 수도 있고 거짓일 수도 있음. 위험. 부호가 같거나 뒤섞임
-1LL < 0UL  // 상황에 따라 참일 수도 있고 거짓일 수도 있음. 위험. 부호가 같거나 뒤섞임

첫 번째부터 세 번째 비교 연산은 아무 문제가 없다. 피연산자의 타입이 다르더라도 부호가 섞이진 않기 때문이다. 이런 경우에는 어느 한 쪽 값의 범위가 다른 쪽을 포함하므로 C 언어에서는 넓은 타입으로 변환한 후 비교 연산을 수행한다.

네 번째와 다섯 번째 연산은 모호한 점은 없지만 초보 프로그래머 입장에선 의외라는 생각이 들 수 있다. 실제로 둘 다 피연산자가 unsigned int로 변환된다. 따라서 여기 나온 음수 값 두 개는 모두 부호 없는 큰 값으로 변환되어 비교 연산의 결과는 거짓(false)이 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.