最近、64bit型を使うことが増えてきた。
その場合は、uint64_tにしている。
デバッグで値を標準出力に出したい場合、printf()を使っている。
そのとき、"%d"なんか使うと、warningが出てしまう。
今使っている環境では、
printf("%llu\n", (unsigned long long)value);
などとしている。
これでも困りはしないのだが、キャストが長すぎる。
確か、uintXX_t系の書式が定義されていたはずだ。。。
困ったときは、オライリーのCクイックリファレンスだ。
さすがにここは、古い本には載っていない。
目次で見つけたのは、「第18章 標準ライブラリ関数」のprintfだ。
持っている本では、p.520の表18-9に載っていた。stdint.hで定義されているらしい。
ふむふむ、uint64_tで16進数だったら「PRIx64」でよいようだ。
#include <stdio.h>#include <stdint.h> int main(int argc, char *argv[]) { uint64_t val = 0x123456789abcdef0ULL; printf("val = %" PRIx64 "\n", val); return 0; }
しかし・・・コンパイルエラーが出る。。。
なぜだ。。。
他のページを見直すと、「16.3 標準ヘッダの内容」にも同じような内容が書かれていた。
しかし、p.287を見ると「<inttypes.h>」となっている。
#include <stdio.h>
#include <inttypes.h> int main(int argc, char *argv[]) { uint64_t val = 0x123456789abcdef0ULL; printf("val = %" PRIx64 "\n", val); return 0; }
コンパイルが通るではないか!
というわけで、p.520の表18-9は、stdint.hにあるのは整数型の型だけで、変換して石マクロはinttypes.hにあるのを覚えておきましょう。
ちなみに、今回使った「PRIx64」がどういうマクロなのか、printf("%s\n", PRIx64)で見てみました。
lx
えー、そうなの。。。
ちなみに、
PRIu64 : "lu"
PRIi64 : "li"
でした(Bash on Windows)。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。