그라운드 임베디드 유튜브 구독

노트 / C 언어

연산자와 형변환: 버그가 숨는 곳

정수 나눗셈, 암묵적 형변환, 연산자 우선순위. 컴파일은 되는데 값이 틀리는 코드의 원인을 정리했습니다.

GROUND EMBEDDED · 정리 노트C 언어 02연산자와 형변환 1float v = adc * 3.3f / 4095.0f;// 의도대로 동작

C는 계산하기 전에 피연산자의 자료형을 맞춥니다. 이 규칙을 모르면 문법은 맞는데 결과가 틀린 코드를 쓰게 됩니다.

정수 나눗셈

3 / 4는 0입니다. 둘 다 정수라 소수점 아래를 버리기 때문입니다. 전압을 계산할 때 adc / 4095 * 3.3처럼 쓰면 거의 항상 0이 나옵니다. 곱셈을 먼저 하거나 실수로 바꿔서 계산합니다.

float v = adc * 3.3f / 4095.0f;   // 의도대로 동작

정수 승격

uint8_t끼리 더해도 계산은 int로 올라가서 합니다. 그래서 uint8_t a = 200, b = 100;일 때 a + b는 300이고, 다시 uint8_t에 담는 순간 44가 됩니다. 부호 없는 값과 부호 있는 값을 비교하면 음수가 아주 큰 양수로 바뀌는 문제도 같은 규칙에서 나옵니다.

우선순위

if (reg & MASK == 0)은 ==가 먼저 계산되어 reg & (MASK == 0)이 됩니다. 비트 연산이 섞인 조건식에는 괄호를 아끼지 않습니다.