32bit/64bit 両対応な printf の書き方

32bit/64bit両対応のコードを書いていると,よく printf() で引っかかります."%d"のような"書式"がややこしいからです.

というわけで,変数の"型"と"書式"の対応を,表で整理してみました.

書式 注意事項
ssize_t %zd
size_t %zu
intmax_t %jd
uintmax_t %ju
ptrdiff_t %t
signed char %hhd
unsigned char %hhu
short int %hd
unsigned short int %hu
int %d
unsigned int %u
long int %ld
unsigned long int %lu
long long int %lld
unsigned long long int %llu
int32_t %PRId32 以下,#include が必要(下記参照)
uint32_t %PRIu32
int64_t %PRId64
uint64_t %PRIu64

補足1: 16進数等の表示

  • 16進表示の場合は 上表の"u" を "x" に置き換える.例)"%lu" → "%lx"
  • 8進数表示の場合は 上表の"u" を "o" に置き換える.例) "%lu" → "%lo"

補足2: inttypes.hの使い方

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

または

#include <cinttypes>

ソースコードに書く.