GCC 4.4.1で Code :: Blocks を使用していますが、Cコードから64ビットの符号付き整数を出力できません。
このコード:
long long longint;
longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */
printf("Sizeof: %d-bit\n", sizeof(longint) * 8); /* Correct */
printf("%llx\n", longint); /* Incorrect */
printf("%x%x\n", *(((int*)(&longint))+1), longint); /* Correct */
printf("%lld\n", longint); /* Incorrect */
出力を生成します:
Sizeof: 64-bit
cdefcdef
1bcdefabcdefcdef
-839922193
64ビット演算は正しく機能しているようです:
longint -= 0x1000000000000000;
printf("%x%x\n", *(((int*)(&longint))+1), longint);
与える:
bcdefabcdefcdef
何か不足していますか?
%I64d
が役立ちます。 %lld
はlong long int
しかし、Windows IDEでは状況が実際に異なる場合があります
(C99以降で)64ビット整数を移植可能に出力するには、#include <inttypes.h>
およびC99マクロを使用しますPRIx64
およびPRId64
。それはあなたのコードを作るでしょう。
printf("Sizeof: %d-bit\n", sizeof(longint) * 8);
printf("%" PRIx64 "\n", longint);
printf("%" PRId64 "\n", longint);
編集:その他の例については この質問 を参照してください。
これはOSに依存します。 GLIBCを使用するほぼすべてのGCCでこれを実行している場合、%llxが機能します。
ただし、mingwコンパイラを使用している場合、これはMicrosoftライブラリを使用するため、それらの documentation を調べる必要があります。
これにより、プログラムが次のように変更されます。
longint = 0x1BCDEFABCDEFCDEFLL; /* 2003520930423229935 */
printf("Sizeof: %d-bit\n", sizeof(longint) * 8); /* Correct */
printf("%I64x\n", longint); /* Incorrect */
printf("%x%x\n", *(((int*)(&longint))+1), longint); /* Correct */
printf("%I64d\n", longint);
longint = 0x1BCDEFABCDEFCDEF;/* 2003520930423229935 * /次のように印刷できます-
printf( "%llx"、longint);
最後にそれを得た:
longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */
printf("%I64d\n", longint);
printf("%I64x\n", longint);
プリント:
2003520930423229935
1bcdefabcdefcdef
@npclaudiuに感謝!