小ネタです。
Visual C++2005でunsigned long long などの64bitな値をprintf系関数やcstring::formatで書式化すると妙なことになる場合があったので、バッドノウハウとしてメモしておきます。
例えば、下のようなコードがあったとします。
void testmain()
{
unsigned long long vv = 0x0000000012345678ULL;
unsigned long long uu = 0x0000000000000000ULL;
printf("%x,%x,%s,%s\n",vv,uu,"test","words");
}
普通ですと、12345678,0,test,words
と表示されるのですが、MSVCでは12345678,0,(null),(null)
というふうに後ろの可変長引数がすっ飛ばされてしまいます。
なお、gccの場合は普通に表示されます。
(ただし、コンパイル時に親切にも警告を出力されます)
また、vvの値を0xFFFFFFFF00000000
などの本当に64Bit値をもたせると、MSVCでは実行時エラーとなり、gccでは上位32Bitが切られて表示されます。
(これはgccの動作が正しいですね)
なお、このように書式文字列に%x
を指定するのではなくて%llx
とするとちゃんと表示できます。
void testmain()
{
unsigned long long vv = 0x0000000012345678ULL;
unsigned long long uu = 0x0000000000000000ULL;
printf("%llx,%llx,%s,%s\n",vv,uu,"test","words");
}
つまりこれは%x
指定では、ライブラリは数値の長さを分からずにすっ飛ばしてしまうということで問題が出てしまったのかもしれません。
(gccみたいに警告を出してくれるといいのですけどね)
あと、STLでお馴染みの<<
系で出力すれば問題なく出力出来ました。
void testmain()
{
unsigned long long vv = 0x0000000012345678ULL;
unsigned long long uu = 0x0000000000000000ULL;
cout << hex;
cout << vv << "," << uu << "," << "test" << "," << "words" << endl;
}
ということで、64Bit整数を扱う場合は書式文字列に気をつけましょうということで...