본문 바로가기
Program Language/C

printf uint64_t uint32_t

by Leo 리오 2011. 12. 1.
반응형
C 언어 표준에서는 자료형의 정확한 사이즈를 정의하지 않고 있다. 예를들어 int는 몇 바이트, long은 몇 바이트와 같이 정의되어 있지는 않고 아래와 같이 최소한의 제약사항을 두고 있을 뿐이다.

char type은 127 이상을 저장할 수 있다
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);
반응형

댓글