c/c++ 표준 int 타입
TRANSCRIPT
C/C++ 표준 int 타입2015/07 류창우
C 명세의정수타입기준은느슨함
char - 최소 8 비트인최소주소단위unsigned 일수도있음 (e.g. ARM)
short - 최소 16비트int - 최소 16비트 , 가장빠른타입long - 최소 32비트char <= short <= int <= long
비트크기가고정된타입의필요성
파일포맷 네트워크프로토콜 하드웨어레지스터
옛날에는 ...typedef unsigned long DWORD; /* 32 bits*/typedef unsigned short WORD; /* 16 bits */typedef unsigned char BYTE; /* 8 bits */...
라이브러리 / 프레임워크마다다르다
<windows.h> DWORDword 가 2 바이트였던 16 비트시절잔재
MFC uint32glib guint32Qt quint32
플랫폼마다다르게정의해야
IA32sizeof(int) == 4sizeof(long) == 4sizeof(void*) == 4
IA64sizeof(int) == 4sizeof(long) == 8sizeof(void*) == 8
printf()format descriptor …도환경에따라달라짐
#ifdef __x86_64__printf(“=> %u\n”, u32); /* unsigned int */#elseprintf(“=> %lu\n”, u32); /* unsigned long */#endif
pointer => intint 가포인터를저장한다는보장을못함 .
void* ptr = blahblah();int data = (int) ptr; /* IA64 bug: 64b => 32b */send(data);
그래서 , 표준을씁시다
int8_t, uint8_t, int16_t, uint16_tint32_t, uint32_t, int64_t, uint64_t
새로운 (?) 표준C99 #include <stdint.h>C++11 #include <cstdint>
충분히널리쓰이는표준 => 레가시아웃 ! 이제항상이걸쓰면된다 !
엄밀히말하자면 ..int32_t (optional)- 하지만사실상필수
int_fast32_t ( 최소 32 비트인가장빠른타입 )- 작은타입이오히려느릴수도있으므로
int_least32_t ( 최소 32 비트인최소타입 )- 작은타입을지원하지않을수도있으므로
( 하지만사실상없음 )
printf() 에서사용
#include <inttypes.h>
/* PRI<conversion><bits> */printf(“=> ” PRIu32 “\n”, u32);
pointer => intptr_tintptr_t ( 포인터를저장할만한크기의 int)- 이것도 optional 이지만사실상필수
void* ptr = get_pointer();intptr_t data = (intptr_t) ptr;send(data);
보너스 : C bool 표준타입
C99:#include <stdbool.h>bool flag;flag = false;flag = true;