Journey to CS/임베디드

아두이노에서 어떤 정수 타입을 써야 할까? 데이터 타입 비교표 한 눈에 보기

Cordilog 2025. 8. 13. 21:19

아두이노 코드를 보다 보면 uint8_t, uint16_t, uint32_t 같은 낯선 타입이 자주 등장한다.
uint8_t, uint16_t, uint32_t가 무슨 뜻인지, 아두이노 기본 타입과 어떻게 대응되는지, 그리고 어떤 상황에 어떤 타입을 써야 하는지 알아보자.

 

1. 읽는 방법

uint32_t를 예로 들면:

u unsigned (부호 없음, 0 이상)
int 정수(integer)
32 비트 수 (32비트 = 4바이트)
_t type (자료형)

 

2. Arduino 기본 타입과 1:1 대응표

고정폭 타입 (stdint.h) Arduino 기본 타입 크기(byte) 값 범위 부호
uint8_t byte 1 0 ~ 255 부호 없음
int8_t char 1 -128 ~ 127 부호 있음
uint16_t unsigned int 2 0 ~ 65,535 부호 없음
int16_t int 2 -32,768 ~ 32,767 부호 있음
uint32_t unsigned long 4 0 ~ 4,294,967,295 부호 없음
int32_t long 4 -2,147,483,648 ~ 2,147,483,647 부호 있음
uint64_t *(없음*) 8 0 ~ 18,446,744,073,709,551,615 부호 없음
int64_t *(없음*) 8 약 ±9.22×10¹⁸ 부호 있음

* 일부 보드(ESP32, ARM 계열 등)에서는 unsigned long long / long long 사용 가능

 

3. 상황별 추천 타입  : 언제 어떤 타입을 쓸까?

1) 핀/채널/인덱스/개수

  • uint8_t
    • 예: GPIO 핀 번호, I2C/PWM 채널(0~15), 배열 인덱스(작은 범위)
    • 이유: 값 범위가 작고 메모리 절약.

2) 범위가 0~4095(12bit)처럼 “살짝 큰” 값

  • uint16_t
    • 예: ADC 12bit, PCA9685 듀티(0~4095)

3) 시간(ms, us)·타이머·누적 카운터

  • uint32_t
    • 예: millis(), micros() 결과 저장, 타임스탬프/경과시간
    • 이유: 오버플로(랩어라운드) 안전 패턴(unsigned 뺄셈) 사용 가능.

4) 음수가 필요한 경우

  • int8_t / int16_t / int32_t
    • 예: 센서 보정치(±), 위치/속도 변화량(±)
    • 당신 코드에선 상태값/타이밍은 음수 필요 없음 → unsigned 유지 OK.

5) 크기/길이/메모리 관련

  • size_t
    • 예: 버퍼 크기, 배열 길이, sizeof 결과
    • 이유: 플랫폼 독립 “적절한” unsigned 정수.
    • 소형 루프 인덱스는 uint8_t도 OK지만, 범용성은 size_t.

6) 불리언 플래그

  • bool
    • 예: motorPrevOn, 버튼 눌림 플래그, 상태 토글
    • 당신 코드: 이미 bool 잘 사용 중.

📌 요약

상황 추천 타입 이유
핀 번호, 채널 번호, 작은 범위 인덱스 (0~255) uint8_t 메모리 절약, 충분한 범위
PWM 듀티(0~4095), 12~16비트 센서값 uint16_t 손실 없이 저장 가능
millis() / micros() 값, 시간 계산 uint32_t 오버플로 안전, 긴 범위
음수도 필요한 센서값/보정치 int16_t / int32_t 부호 있음, 범위 넓음
버퍼 크기, 배열 길이 size_t 플랫폼 독립적 크기 타입
플래그(참/거짓) bool 가독성, 메모리 절약

 

4. 사용 예시

uint8_t ledPin = 13;          // 핀 번호
uint16_t duty = 1023;         // 0~4095 PWM 듀티
uint32_t startTime = millis();// 시간 측정
bool motorOn = false;         // 상태 플래그

 

5. 주의사항

  • AVR(UNO/Nano)에서는 int가 16비트, long이 32비트
  • ARM/ESP 계열에서는 int도 32비트
  • 이식성을 위해 고정폭 타입(uint8_t, uint16_t, uint32_t) 사용을 권장
  • 시간 계산 시 unsigned 빼기 패턴을 쓰면 오버플로에도 안전

✅ 정리

  • uint8_t/uint16_t/uint32_t는 크기와 부호가 명확한 정수 타입
  • 하드웨어 제어, 센서값, 시간 계산처럼 정확한 비트 수가 중요한 경우 반드시 사용
  • Arduino 기본 타입보다 이식성, 명확성이 뛰어남