반응형
C 언어 표준에서는 자료형의 정확한 사이즈를 정의하지 않고 있다. 예를들어 int는 몇 바이트, long은 몇 바이트와 같이 정의되어 있지는 않고 아래와 같이 최소한의 제약사항을 두고 있을 뿐이다.
이 규칙은 char가 적어도 8 bit가 되어야 한다는 것과, short int와 int는 적어도 16 bit여야 한다는 것과, long int는 적어도 32 bit가 되어야 한다는 것을 뜻한다. 실제 각 자료형의 사이즈는 implementation마다 다르다.
따라서 C99에서는 int16_t, uint32_t 등과 같이 정확한 사이즈의 타입을 <inttypes.h>에 정의해 놓았다. 그래서 프로그래머는 프로토콜 정의와 같이 정확한 사이즈의 타입이 필요할때 이 타입들을 사용하면 된다.
하지만 이 타입들을 사용할때 printf로 출력하려고 하는 경우 어떤 출력 포멧을 사용해야할지 알 수 없다. 왜냐하면 시스템마다 int64_t의 실제 타입이 다를테니까.
그래서 이럴때 사용하라고 표준에서 아래와 같은 메크로를 정의해 놓았다.
표 출처: 신성국님의 CFAQs
사용법은 아래와 같다.
char type은 127 이상을 저장할 수 있다
short int type과 int type은 32,767까지 저장할 수 있다
long int는 2,147,483,647까지 저장할 수 있다
short int type과 int type은 32,767까지 저장할 수 있다
long int는 2,147,483,647까지 저장할 수 있다
이 규칙은 char가 적어도 8 bit가 되어야 한다는 것과, short int와 int는 적어도 16 bit여야 한다는 것과, long int는 적어도 32 bit가 되어야 한다는 것을 뜻한다. 실제 각 자료형의 사이즈는 implementation마다 다르다.
따라서 C99에서는 int16_t, uint32_t 등과 같이 정확한 사이즈의 타입을 <inttypes.h>에 정의해 놓았다. 그래서 프로그래머는 프로토콜 정의와 같이 정확한 사이즈의 타입이 필요할때 이 타입들을 사용하면 된다.
하지만 이 타입들을 사용할때 printf로 출력하려고 하는 경우 어떤 출력 포멧을 사용해야할지 알 수 없다. 왜냐하면 시스템마다 int64_t의 실제 타입이 다를테니까.
그래서 이럴때 사용하라고 표준에서 아래와 같은 메크로를 정의해 놓았다.
intN_t | int_leastN_t | int_fastN_t | intmax_t | intptr_t |
PRIdN | PRIdLEASTN | PRIdFASTN | PRIdMAX | PRIdPTR |
PRIiN | PRIiLEASTN | PRIiFASTN | PRIiMAX | PRIiPTR |
uintN_t | uint_leastN_t | uint_fastN_t | uintmax_t | uintptr_t |
PRIoN | PRIoLEASTN | PRIoFASTN | PRIoMAX | PRIoPTR |
PRIuN | PRIuLEASTN | PRIuFASTN | PRIuMAX | PRIuPTR |
PRIxN | PRIxLEASTN | PRIxFASTN | PRIxMAX | PRIxPTR |
PRIXN | PRIXLEASTN | PRIXFASTN | PRIXMAX | PRIXPTR |
표 출처: 신성국님의 CFAQs
사용법은 아래와 같다.
uint64_t total = 1000000;
snprintf(buf, sizeof(buf), "TEST: %" PRIu64 " (sec)\n", total);
snprintf(buf, sizeof(buf), "TEST: %" PRIu64 " (sec)\n", total);
반응형
'Program Language > C' 카테고리의 다른 글
extern static 정리 (1) | 2012.04.25 |
---|---|
caller 찾기 (0) | 2012.01.27 |
ignoring return value of 'system', declared with attribute warn_unused_result (0) | 2011.11.11 |
format not a string literal and no format arguments (0) | 2011.11.11 |
The Context Free Grammar Checker (0) | 2011.10.12 |
댓글