web-dev-qa-db-ja.com

64ビット整数を16進数としてprintfする方法は?

次のコードでは、printf()を使用して_unit64_t_変数の値を出力しようとしています。 gccでコードをコンパイルすると、次の警告が返されます。

警告:形式 '%x'はタイプ 'unsigned int'の引数を必要としますが、引数2はタイプ 'uint64_t' [-Wformat =]

コード:

_#include <stdio.h>
#include <stdint.h>

int main ()
{
    uint64_t val = 0x1234567890abcdef;
    printf("val = 0x%x\n", val);

    return 0;
}
_

出力:

_val = 0x90abcdef
_

期待される出力:

_val = 0x1234567890abcdef
_

printf()を使用して64ビット値を16進整数として出力するにはどうすればよいですか?この場合、x指定子は間違っているようです。

22
sergej

コンパイラからの警告は、フォーマット指定子が渡されるデータ型と一致しないことを示しています。

_%lx_または_%llx_を使用してみてください。移植性を高めるには、_inttypes.h_を含め、_PRIx64_マクロを使用します。

例:printf("val = 0x%" PRIx64 "\n", val);(文字列の連結であることに注意してください)

36
tangrs

編集:代わりにprintf("val = 0x%" PRIx64 "\n", val);を使用します。

printf("val = 0x%llx\n", val);を試してください。 printf manpage を参照してください:

ll(エルエル)。次の整数変換は、long long intまたはunsigned long long int引数に対応します。または、次のn変換は、long long int引数へのポインターに対応します。

編集:@M_Oehmが書いたものはさらに良いです。そのための特定のマクロがあります。unit64_tは常にunsigned long longPRIx64も参照してください このstackoverflow answer

5
Superlokkus