이전 포스트에 이어서 기본 데이터 타입에 관하여 설명을 하고자 한다.
기본 데이터 타입은 굳이 C언어 뿐만이 아니라, JAVA등과 같은 많은 언어들과도 공통되므로 잘 알아둬야 한다.
이에 대하여 이야기를 시작하도록 하겠다.
기본 데이터 타입에 관하여 아래의 표와 같이 정리를 한다.
상세한 이야기는 다음 목차부터 설명을 하겠다.
이름 | type | size(bit) |
---|---|---|
char | 문자형, 정수형 | 8 bit |
short | 정수형 | 16 bit |
int | 가변 정수형 | unknown |
long | 정수형 | 32 bit |
long long | 정수형 | 64 bit |
float | 부동소수점 | 32 bit |
double | 부동소수점 | 32, 64 bit, depends on align |
char 자료형은 ASCII 문자를 표현하기 위한 자료형으로 사용을 하면서, 동시에 정수를 담는 용도로 사용을 하기에 문자형, 자료형이라고 설명을 적었다. 그리고 이 자료형은 "단일 문자"를 담는 하나의 공간이지, "문자열"을 담는 공간은 아니다. 추구 pointer 파트를 넘어가게 되면 문자열로 설명을 할 예정이지만, 문자열이란 그저 단일 문자들의 조합 + null 문자의 조합으로 만들어진 것이다.
또한, 이젠 C에서도 표준이 된 bool타입은 아직은 잘 활용을 하지 않고, 옛날부터 사용해 왔던 char 타입을 boolean으로 typedef를 하여 이를 표현을 하기도 한다.
재밌는건 대부분의 언어는 8 bit이지만, C#이나 TMS320 C compiler같은 것들은 16 bit이니 이를 참고해야 한다.
이 자료형은 byte과 매칭되기도 한다.
short 자료형은 16 bit 범위의 정수를 표현하기 위한 자료형이다.
문자만 담지 않을 뿐이지, char형과 차이가 없다.
8 bit MCU에선 이 타입을 word이라 부르기도 하지만
32 bit MCU에선 이 타입을 halfword이라 부르기도 한다.
int 자료형은 C언어에 대한 친숙함을 가지기 위해 printf와 함께 처음 맞이하는 자료형이기도 하다.
하지만 다른 시스템에선 어떨진 몰라도, Embedded Firmware에서만큼은 int 자료형을 피해야 한다.
왜냐하면 이 int의 사이즈를 결정짓는 것은 다름아닌 compiler이기 때문이다.
이 임베디드 계열에선 같은 C언어를 사용한다 하더라도 core별로 compiler들이 상당히 다양한데, 이 컴파일러들마다 각각의 데이터 타입에 대하여 사이즈가 몇 인지를 명기를 하고 있다.
아래의 예시를 보도록 하자.
8-bit microcontroller인 AVR계열 MCU에서만 사용이 가능한 AVR GCC Compiler이다.
KEIL에서 사용을 하는 컴파일러이다. 사람들이 혼동하는 사항 중 하나가,
"KEIL이 컴파일러 아니야?"라고 말하는데, 이 분야 특성상 개떡같이 말해도 찰떡같이 알아야 하는 동네이기에 "IDE = compiler"라는 인식이 강하다.
하지만 정확히 이야기를 하면 KEIL은 "IDE"이고, 그 안에 사용하는 compiler가 "ARM compiler"이다.
같은 예로 IAR EWARM을 사용하는 회사들도 꽤 있다. 하지만 똑같이 IAR은 "IDE"이고, 그 안에 사용하는 compiler는 IAR-GCC compiler(IAR에서 독자적으로 만든 ARM architecture용 compiler)이다.
IAR은 ARM뿐만 아니라, 여러 코어에 대한 "상용"컴파일러 및 IDE를 만드는 곳으로 유명하다. (컴파일 효율도 상용컴파일러중 꽤나 상위권으로 평할 만큼 호평을 받음)
그 중에 8051 architecture에 대한 데이터 타입의 설명이다.
자동차 계열에서 ASIL-D 대응용 멀티코어로 악명높은 녀석이다. 특히 멀티코어이기에 semaphore에 대한 별도의 키워드가 존재할 정도로 복잡한 microcontroller일 정도로 성능이 막강하다.
long 자료형은 short 자료형과 마찬가지로 32-bit의 정수를 표현하는 자료형이다.
특이한 점이 있다면, 이 long형을 붙여서 long long으로 타입을 재 선언하면 64-bit 자료형을 만들어 사용하기도 한다.
이 자료형은 double word의 단위와 매칭되기도 한다.
여담으로 TMS320 compiler에선 이 long형을 32-bit가 아닌 40-bit가 할당이 된다 카더라(...)
float, double 자료형은 소수점을 표현하기 위해 사용하는 자료형이다.
2진수로만 표현하는 digital 세계의 특성상 IEEE754라는 하나의 규칙을 따라 부동소수점을 표기한다.
간단하게 요약하면,
최상위 부호 비트 + 지수(exponent) + 가수(fractional 또는 mantissa)의 조합으로 소수점을 표현한다.
그리고 이 데이터형을 완전히 정복하게 되면, FPU가 없이 빠른 소수점 연산을 가능케 만들기도 하는데, 가장 대표적인 예로, Infineon에서 부분 공개한 SW DSP에서 sin, cos과 같은 mathmatic 계열 연산이 exponent와 mantissa를 bit shift사용하여 처리를 한다. (이걸 사용하는 MCU에 엄청 성능 좋은 FPU가 달려 있는게 함정)
하지만 일반적으론 FPU가 달려 있는 MCU가 그리 많이 달려있지 않는게 현실이기에 이 부동소수점을 시스템에 따라 채용을 하기도, 안 하기도 한다. 아니면 극히 제한적으로만 사용하거나.
그리고 통신에서도 깡으로 exponent와 mantissa를 보내지 않는 이상(union을 사용하면 이게 가능하게 만들 수 있긴 하다.), 일반적으로 고정소수점을 사용하여 전송한다.
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.