web-dev-qa-db-ja.com

printf( "%llx")の何が問題になっていますか?

私はCのすべての知識に挑戦しているこのコードを持っています。ここに私はあります:

_int main(void){
    unsigned long long int massage ;

    scanf("%llX", &massage); //input: 0x1234567890abcdef
    printf("%llX", massage);
    return 0;
}
_

私の「64ビット-Corei5-Fedora-GCC」では、私がフィードしたものを正確に出力します。しかし、私のバディのシステム(32ビット、MS XP、MinGW)では、_90ABCDEF_が出力されます。理由がわかりません。誰か知っている?

ところで:彼のシステムのsizeof(unsigned long long int)は8です。

12
Untitled

問題は、コンパイラが信じるもの(sizeofに反映されるように:sizeof(unsigned long long int)はコンパイル時に評価される)とランタイムライブラリが信じるもの(printfprintf関数は実行時に呼び出されるため、そのフォーマット指定子が有効になります)。

MinGWドキュメントの "C99" によると:

GCCにはCランタイムライブラリは含まれていません。これはプラットフォームによって提供されます。 GCCのMinGWポートは、Microsoft Visual Studio 6(1998年にリリース)の対象となったMicrosoftの元の(古い)VisualCランタイムであるMSVCRTを使用します。

[…]

MinGWはMSVCRTに依存しているため、Visual Studio 6と互換性のある多くの同じ制限と癖があります。MinGWアプリケーションはC99の動作に依存できず、C89のみに依存すると想定する必要があります。たとえば、%aや%llなどのprintfの新しい形式の文字はサポートされていませんが、 %llの回避策 が存在します。

(言及されている回避策は、llの代わりにI64を使用することです。したがって、%I64X。厄介なことに、少なくとも私のシステムでは、GCCは警告を発行します。リテラルformat-string。これは、より優れたランタイムライブラリがあることを前提としているためです。)

10
ruakh

Windows Cライブラリは、「%lld」ではなく「%I64d」を使用して、「longlong」型の引数を出力します。

参照: http://gcc.gnu.org/ml/gcc-patches/2004-11/msg01966.html

3
Rubens