이 데이터 타입은 C Compiler를 무엇을 사용하냐에 따라 간혹(정말 간혹...당혹스러울 정도로..) 다른 사이즈를 가지기도 하는데 이번 포스트에서 이에 관하여 이야기를 해 보고자 한다.
1. 기본 데이터 타입
기본 데이터 타입이라 함은 C언어에서 예약어로 지정되어서 사용하는 데이터와 관련된 타입들이다.
char, short, int와 같은 것들이 해당되는 데이터 타입인데, 표로 정리하면 아래와 같다.
이름 | type | size(bit) |
char | 문자형, 정수형 | 8-bit |
short | 정수형 | 16-bit |
int | 가변 정수형 | unknown |
long | 정수형 | 32-bit |
long long | 정수형 | 64-bit |
float | 부동소수점 | 32-bit |
double | 부동소수점 | 32-bit or 64bit, depends on setting |
1-1 char
char 자료형은 ASCII 문자를 표현하기 위한 자료형으로 사용을 하면서, 동시에 정수를 담는 용도로 사용하기에 문자형, 정수형이라고 작성했다. 임베디드쪽에선 C++을 사용하지 않는 곳에서, 순수 C언어를 사용하는 곳에선 주로 사용하는 언어 버전이 C14이기에 bool타입이 없다. 그래서 이 char를 bool로 새로운 데이터 타입으로 선언하여 많이들 사용하기도 한다.
여담으로 대부분은 char 타입이 8-bit이지만, TMS320C28x C compiler 같은 것들은 16-bit이니 이 microcontroller를 처음 만진다면 이를 한번 기억해 볼만 하다.
1-2 short
short 자료형은 16-bit 범위의 정수를 표현하기 위한 기본 자료형이다.
네이버에선 "문자만 담지 않을 뿐이지, char형과 차이가 없다." 라고 작성을 했는데...
생각해보니깐 유니코드가 16-bit였잖아...?
게다가 키보드 방향키도 2byte날라오잖아...?
유니코드 많이 쓰시는 분들은 이걸 문자 담는 공간으로 사용할 법도 하겠는데...?
1-3 int
int 자료형은 C언에 대한 친숙함을 가지기 위해 printf와 함께 처음 맞이하는 자료형이기도 하다.
하지만 다른 시스템에선 어떨진 몰라도, Microcontroller 시스템에서만큼은 int 자료형을 피해야 한다.
(그래서 Firmware 코드를 보면 이를 통일하려고 stdint라는 헤더를 굉장히 자주 사용한다.)
왜냐하면, 이 int의 사이즈를 결정짓는 것은 다름아닌 compiler이기 때문이다.
(물론 word인 CPU datawidth가 이를 결정하기 때문인데...)
Microcontroller가 그냥 CPU를 다 공통적으로 사용하는 것 처럼 보이지만, 까보면 굉장히 다양한 CPU를 사용한다.
대표적인게 ARM CPU를 굉장히 사용을 많이 하지만, 업계마다 선호하는 CPU가 굉장히 다르다.
자동차쪽 경험할 때도 Cortex M 시리즈도 좀 많이 사용하는데, 이뿐만 아니라 NXP의 Magni IV나, AURIX도 사용한다.
물론 TI의 TMS도 굉장히 사랑하는 회사들도 많고(군사쪽 종사하시는 분들은 TMS 많이 사용한다 들음..).
이러한 내용들은 당장 취업 전에 익히기 보단, "아 이런 썰이 있었지. 한번 확인해볼까?" 수준으로 현장에서 부딪히는 것도
굉장히 추천하는 바이다.
(데이터시트 읽기 귀찮거나, compiler manual 읽기 귀찮으면 직접 사이즈 재야지 뭐...)
자 다 귀찮으면, 아래 이런 이런 정보들이 있으니 한번 쓱 훑어보고 "이런 녀석도 있더라" 정도만 기억해도 된다.
(1) AVR Compiler
8-bit microcontroller인 AVR 계열 MCU에서만 사용이 가능한 AVR GCC Compiler이다.
음...초기 arduino에 들어간 microcontroller(atmega328)라고 이해하면 편하다.
(2) ARM target compiler(arm-gcc/iar/ARM compiler)
ARM계열, 특히 Cortex M계열 MCU를 다뤄 본 사람들이라면 위의 컴파일러들 중 하나를 사용할 것이다.
그 중에 KEIL이라는 개발환경에서 사용하는 ARM compiler를 기준으로 했다.(정보 구하기 제일 쉬움)
(3) 8051 compiler
10년 전에 라이센스가 풀려서 이 CPU를 사용하는 micrcontroller가 많이 늘어남에 따라 사용 빈도도 높아진 8051 compiler.
신입 시절 내 두통의 원인이기도 했던 8051...
특히 저전력쪽에 붙어서 많이 나오던데 한번쯤은 짚고 넘어가도 될 것 같아서 리스트에 넣었다.
참고로 링크가 EW8051 메뉴얼을 연결해서 "IAR은 Cortex compiler 아니야?" 라고 의문을 가질 수 있는데,
IAR이 ARM뿐만이 아니라 8051, AVR등 다양한 RISC CPU에 대한 상용 컴파일러 및 IDE를 만드는 곳으로 유명하다.
신입시절 커뮤니티 같은곳에서 KEIL이냐 IAR이냐로 언쟁 벌였을 정도로 컴파일러를 굉장히 잘 만드는 회사로 유명했지...
근데 비싸다...개인이 살 돈이 아니니깐 회사서 사달라고 조르자.
(안 사준다면 포기하자. 요즘 gcc도 잘 나와서...)
(4) AURIX compiler
내가 만졌던 Microcontroller중에서 제일 복잡해서 정신 없었던 Infineon사의 AURIX..
일개 벤더에서 다루었던 core이지만, 워낙에 잘 만들기도 했고, 복소수 연산도 좋구..
혹시나 자동차쪽 관심이 있다면 몇개의 CPU를 알아두면 편한게 몇개 있는데, 그 중 하나가 이 AURIX이다.
(처음 만질때 진심 멘붕이었다...)
수다좀 좀 더 떨자면,
자동차쪽에는 ASIL이라고 안전 등급이 있는데, Q, A, B, C, D순으로 등급이 점점 높아지는 구조이다.
그 중에서 가장 높은 등급인 D등급을 대응 가능케 하는 microcontroller이다.
(각 등급마다 사용하는 MCU도 굉장히 천차만별이다.)
게다가 코어도 1개가 아니고 3개씩(요즘은 더 달려서 나오더라...)이나 달려서
semaphore가 별도의 C 키워드로 달려있을 정도로 성능과 기능이 막강하다.
이에 대한 코드를 컴파일하는 Tasking AURIX compiler로 선정하여 작성한다.
근데 요즘은 이거 이렇게 딥하게 알 필요는 없을꺼 같은데...?
플랫폼이 뭐 나와서 개발하기 좋아졌다라는 카더라를 들은지라
솔직히 그 외에도 어마무시하게 많은데, 내가 만져봤던 것들을 기준으로만 작성했으니깐...
처음 만져본 microcontroller다?
무조건 데이터시트 열고 microcontroller의 block diagram을 확인하여 정보부터 얻도록 하자.
(임베디드쪽 안 올꺼면 이 멘트는 그냥 무시해도 좋다)
1-5 long
long 자료형은 타입으로서 특별한 것은 없다.
아 특이한 점이라면 long long이라고 이렇게 붙여서 선언하면 64-bit가 된다는 점...?
다만 microcontroller쪽에도 굉장히 특이사항이 하나가 있긴 하다..
대부분은 32-bit인데, 어떤 micrcontroller는 이 long타입이 40-bit라는 괴상 망측한 숫자를 가지고 있다.
(TMS320C6000 정보 얻고, 이를 만져본 분 이야기 들었는데...이게 진짜라는게 충격)
살면서 2의 지수승의 데이터 타입을 만들지 않은 microncontroller는 얘가 처음이자 마지막이지 싶다.
1-5 float, double
이건 네이버에서 주접떤 곳에서 보면 될 듯 하다.
2. 사용자 정의 데이터 타입
이건 기본형 이외의 데이터 타입들을 의미한다.
typedef 선언한 데이터 타입들이 이에 해당하며, 조금 더 나가면 나중에 이야기할 struct/union도 이에 해당한다.
실무 코드를 딱 보다보면, 거의 대부분은 기본 데이터 타입보단 stdint라는 헤더에 정의한 데이터 타입을
주로 사용한다. 이는 플랫폼에 의존적이지 않은 코드를 만들기 위해 그러는 것이다.
생각해봐라. AVR같은 작은 microncontroller가지고 놀다가
갑자기 사장이 싸다면서 갑자기 전혀 다른 Cortex M같은 microcontroller를 들이밀었을때 그냥 복붙해서 쓰면
기본 데이터 타입때문에 제품 코드 곱창나는 일이 왕왕 있다. 이거 필자가 신입때 경험함..절대 경험하지 마라.
'C언어 이야기' 카테고리의 다른 글
C언어 - 연산자 (1) | 2025.06.18 |
---|---|
C언어 - 변수들 사이의 형 변환(1) (1) | 2025.06.11 |
C언어 - 변수의 선언 (0) | 2025.05.28 |
C언어를 이해하기 위한 기초 지식 - 메모리구조 (0) | 2025.05.21 |
C언어를 이해하기 위한 기초 지식 - 소수점의 표현 (0) | 2025.05.14 |