프로그래밍C 개발자

C 언어의 표현식에서 적용되는 형 변환(type conversion, type promotion) 규칙은 무엇인가요? 예상치 못한 오류와 해결책의 예를 제시해주세요.

Hintsage AI 어시스턴트로 면접 통과

답변

C 언어의 표현식에서 종종 발생하는 형 변환 (type promotion, type conversion)은 표준에 의해 조절됩니다:

  • 정수 승격(Integer Promotion): 작은 속성의 타입(예: char, short)은 자동으로 int 또는 unsigned int로 변환되어 산술 연산 전에 처리됩니다.
  • 일반 산술 변환(Usual Arithmetic Conversions): 피연산자가 서로 다른 타입일 경우, 정해진 규칙에 따라 "더 넓은" 타입으로 변환됩니다.
  • 부호가 있는 타입과 부호가 없는 타입 혼합 연산에서 결과는 변환으로 인해 예기치 않게 변경될 수 있습니다.

예시:

unsigned short a = 65535; signed short b = -1; printf("%d ", a + b); // 변환에 따라 달라집니다!

추천 사항: 비트 연산, 배열 길이, 인덱스 작업 시 피연산자의 타입에 주의하고, 부호가 있는 타입과 부호가 없는 타입 간의 암묵적인 혼합을 피하세요.

트릭 질문

다음 조각은 무엇을 출력할까요?

unsigned int u = 1; int i = -2; printf("%d ", u + i);

답변: 변수 iunsigned int로 변환되며, 최종 값은 매우 커져서, 결과는 기본적으로: 1U + (unsigned int)-2U가 되며, 이는 UINT_MAX (4294967295)에 가까운 값을 제공합니다. 만약 printfint로 형식을 설정하면 음수를 출력하지만 그렇지 않으면 쓰레기를 출력합니다.

주제에 대한 세부 사항을 모르는 상태에서 실제 오류 사례


이야기

영상의 평균 강도를 계산할 때 intunsigned int를 혼동했다. 부정적인 값들이 unsigned로 잘못 변환되어 거대한 숫자가 되어 이미지 버퍼가 오버플로우되었다.


이야기

임베디드 펌웨어에서 문자열 길이를 size_t로 계산하고 배열의 인덱스를 int로 했다. 배열 범위를 초과하는 조건을 확인할 때 int i >= size_t len을 비교하여 긴 문자열의 로직이 깨지고 서로 다른 타입(수치 - unsigned) 비교 시 버그가 발생했다.


이야기

금융 프로젝트의 개발자는 부정적인 숫자에 대해 % 연산을 통해 나머지를 계산하여 결과의 부호가 부정적 피연산자에 따라 다르다는 사실을 잊었다. 한 환경에서는 결과가 긍정적이었고 다른 환경에서는 부정적이어서 계산이 주기적으로 "어긋났다".