변수와 자료형: uint8_t를 쓰는 이유
int의 크기는 컴파일러마다 다릅니다. 임베디드에서 크기가 정해진 자료형을 쓰는 이유와 부호, 오버플로를 정리했습니다.
C 표준은 int가 "최소 16비트"라고만 정합니다. 8비트 AVR에서는 16비트, ARM Cortex-M에서는 32비트입니다. 레지스터와 통신 패킷은 비트 수가 정확히 맞아야 하므로 임베디드에서는 <stdint.h>의 고정 폭 자료형을 씁니다.
자주 쓰는 자료형
| 자료형 | 크기 | 범위 |
|---|---|---|
uint8_t |
8비트 | 0 ~ 255 |
int16_t |
16비트 | -32768 ~ 32767 |
uint32_t |
32비트 | 0 ~ 약 42억 |
float |
32비트 | 소수, FPU가 있으면 빠름 |
오버플로
uint8_t에 255를 담고 1을 더하면 0이 됩니다. 부호 없는 정수는 이렇게 감싸 돌아가는 것이 정의된 동작이지만, 부호 있는 정수의 오버플로는 정의되지 않은 동작이라 컴파일러가 무슨 일을 해도 이상하지 않습니다. ADC 값을 누적하는 변수처럼 커질 수 있는 값은 처음부터 넉넉한 크기로 잡습니다.
현업 습관
- 레지스터, 패킷, 센서 원시값은 항상 고정 폭 자료형
- 루프 카운터처럼 크기가 상관없는 곳만
int - 음수가 나올 수 있는 차이값은 부호 있는 자료형으로 받기