임베디드 용어 사전
C 함정

정수 승격

작은 정수 타입이 연산 전에 int로 확대되는 C 규칙. 부호가 섞이며 예상과 다른 결과를 만든다.

연산 직전에 char·short 같은 타입이 int 로 올라간다. 눈에 안 보여서 더 위험하다.

uint8_t a = 200, b = 100;
uint8_t c = a + b;          // a+b 는 int 로 300, 대입에서 잘려 44

if (a + b > 255) { }        // 참이다. uint8 연산처럼 보이지만 아니다

부호가 섞이면 더 나빠진다

uint16_t x = 10;
if (x - 20 > 0) { }         // 16비트가 int 로 승격 → -10 → 거짓 (32비트 환경)
                            // 하지만 int 가 16비트인 환경에서는 unsigned 로 남아 참

같은 코드가 MCU 마다 다르게 동작한다. 8/16비트 MCU 를 함께 다루는 팀에서 실제로 겪는 문제다.

습관

  • 비교 전에 의도한 타입으로 명시 캐스트한다
  • 시프트·마스크 상수에 u 를 붙인다
  • 정적 분석기(MISRA essential type model)가 이 계열을 잡아 준다

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 임베디드 C 함정 — 컴파일은 되는데 틀린 것들