14

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 です。

4

2 に答える 2

11

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

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

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

[…]

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

(それが言及している回避策は、 : so,I64の代わりに使用することです。厄介なことに、少なくとも私のシステムでは、GCC はリテラル フォーマット文字列でそれを検出すると警告を発行します。時間ライブラリ)ll%I64X

于 2012-12-28T15:29:29.303 に答える
4

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

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

于 2012-12-28T15:28:55.027 に答える