37. 정수 승격과 통상 산술 변환, signed/unsigned 혼합의 함정

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C++
// 주제: 정수 승격(integer promotion)과 통상 산술 변환(usual arithmetic conversions),
//       signed/unsigned 혼합 연산의 함정
//
// C++ 의 산술 연산자는 피연산자를 먼저 공통 타입으로 변환한다. char/short 등 작은 정수는
// 먼저 int 로 승격되고, signed 와 unsigned 가 섞이면 (같은 랭크일 때) unsigned 로 변환된다.
// 이 규칙이 비교·산술 결과를 직관과 다르게 만드는 경우를 예측·설명하는 문제다.
//
// 과제:
//  1) 아래 출력을 한 줄씩 예측하라(bool 은 0/1 로 출력된다).
//  2) 각 결과가 정수 승격/통상 산술 변환/signed→unsigned 변환 규칙 중 무엇 때문인지 설명하라.
//  3) 게임 서버에서 이런 혼합 비교가 왜 경계 검증(길이·인덱스) 버그로 이어지는지 논하라.

#include <iostream>

int main() {
    int i = -1;
    unsigned u = 1;
    std::cout << (i < u) << "\n";              // (1)

    unsigned char c1 = 200, c2 = 100;
    std::cout << (c1 + c2) << "\n";            // (2)

    short s = -1;
    std::cout << (s > 0u) << "\n";             // (3)

    std::cout << sizeof(true + true) << "\n";  // (4)
    std::cout << (true + true) << "\n";        // (5)

    unsigned a = 10;
    int b = -20;
    std::cout << (a + b) << "\n";              // (6)

    std::cout << (('a' < 'b') ? 1 : 0) << "\n";// (7)
    return 0;
}
내 리뷰 · C++
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.