int型等の数値を0xff
等の16進数形式や010
等の8進数形式で出力・表示する方法を解説します。2進数形式(0b1101
)でのフォーマットはprintf関数側が対応していないため、自作方法を紹介します。
目次
16進数・8進数
printf関数での変換指定が可能です。
8進数の場合は変換指定子o
、16進数の場合は変換指定子x
を用います。#
フラグを追加することで基数を表すプレフィックス(0x
, 0
)を付与することができます。
形式 | 代替形式 | |
---|---|---|
16進数 | %x | %#x |
8進数 | %o | %#o |
10進数 | %d | ── |
2進数 | ── | ── |
// 16進数
printf("%x\n", 16); // 10
printf("%#x\n", 16); // 0x10
// 8進数
printf("%o\n", 9); // 11
printf("%#o\n", 9); // 011
// 10進数
printf("%d\n", 9); // 9
printf("%#d\n", 9); // 9 // 警告:Flag '#' results in undefined behavior with 'd' conversion specifier
2進数
2進数の変換指定には対応していないため、専用の関数を独自に定義する必要があります。
以下のコードはprintb
関数の実装例です。より便利なputb
関数もご用意しました。ご自由にお使いください。
void printb(unsigned int v) {
unsigned int mask = (int)1 << (sizeof(v) * CHAR_BIT - 1);
do putchar(mask & v ? '1' : '0');
while (mask >>= 1);
}
void putb(unsigned int v) {
putchar('0'), putchar('b'), printb(v), putchar('\n');
}
printb(9); // 00000000000000000000000000001001
putb(9); // 0b00000000000000000000000000001001