아두이노 코드를 보다 보면 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 기본 타입보다 이식성, 명확성이 뛰어남
'Journey to CS > 임베디드' 카테고리의 다른 글
| [ATmega328P] 레지스터 직접 제어 방식으로 프로그래밍 해보기 (0) | 2025.09.29 |
|---|---|
| [메모리] 엔디언(Endianness)과 포인터 캐스팅(casting) (1) | 2025.09.14 |
| [아두이노] millis() 타이머 함수로 진동모터와 LED 동시에 작동시키기 (1) | 2025.07.27 |
| 아두이노 스케치를 작성하다가 loop()함수에 대해 생긴 의문...그리고 답 (1) | 2025.07.27 |
| 아두이노에 PWM을 적용해서 LED에 페이드 인 & 페이드 아웃 효과 주기 (1) | 2025.07.17 |