1

ビジュアル C で 16 の 16 進数値を unsigned long long に合わせようとしています

unsigned long long test = 0x1A2A00DABABA7890;
printf("long long value %X\n", test);
printf("%d", sizeof(test));

私の出力はそれが8バイトであることを示していますが、出力として最初の4バイトのみを保存しています

long long value BABA7890
8

これがどのように機能するかを誤解していますか?助けてくれてありがとう。

4

4 に答える 4

5

書式printf指定子が型と一致しないため、未定義の動作が発生します。試す:

printf("long long value %llX\n", test);

%d結果の形式も間違っていますsizeof。そこを利用しているはずです%zu

いくつかの警告設定を有効にすると、コンパイラが警告を表示する場合があります (clangたとえば、デフォルトでは警告が表示されます)。

example.c:6:30: warning: format specifies type 'unsigned int' but the argument
      has type 'unsigned long long' [-Wformat]
    printf("long long value %X\n", test);
                            ~^     ~~~~
                            %llX
example.c:7:14: warning: format specifies type 'int' but the argument has type
      'unsigned long' [-Wformat]
    printf("%d", sizeof(test));
            ~^   ~~~~~~~~~~~~
            %ld
2 warnings generated.

編集: あなたの質問で、Visual C を使用していることに気付きました。これ %zは C99 の機能であり、コンパイラでサポートされていない可能性があります。その場合は、ドキュメントをチェックして、使用する正しい形式を確認する必要があります。

于 2013-02-01T02:40:02.693 に答える
1

正しく保存されていますが、正しく印刷されていません

unsigned long longの場合、%llXを使用する必要があります

于 2013-02-01T02:42:08.373 に答える
1

an の正しい書式指定子はunsigned long longis llX(これは ell-ell であり、11 ではありません)。

標準から:

ll (ell-ell):dの、、、、、または変換指定子がまたは引数に適用されることを指定しiますo。または、次の変換指定子が引数へのポインターに適用されます。uxXlong long intunsigned long long intnlong long int

于 2013-02-01T02:39:58.527 に答える
-1

整数の幅を指定する必要があります。デフォルトでは、printfは32ビットであると想定します。次のように、I64プ​​レフィックスを使用します。

printf( "long long value%I64X"、test);

これは、Visual C /C++についてここに文書化されています。

http://msdn.microsoft.com/en-us/library/vstudio/56e442dc(v=vs.100).aspx

于 2013-02-01T02:44:32.800 に答える