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++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.