1
unsigned__int64 difference;
difference=(64*33554432);
printf ("size %I64u \n", difference);
difference=(63*33554432);
printf ("size %I64u \n", difference);

最初の # はとてつもなく大きいです。2 番目の数字が正解です。62 から 63 に変更すると、どのようにこのような変更が生じるのでしょうか?

最初の値は 18446744071562067968 です 2 番目の値は 2113929216 です

申し訳ありませんが、値は 63 と 62 ではなく、64 と 63 でした。

4

2 に答える 2

9

特に修飾されていない限り、整数リテラルは型intです。あなたが使用しているプラ​​ットフォームでは、 anintは32ビットであると思います。そのため、計算(64*33554432)がオーバーフローしてマイナスになります。これを にキャストするとunsigned __int64、これは非常に大きな正の整数に反転されます。

出来上がり:

int main()
{
    int a1 = (64*33554432);
    int a2 = (63*33554432);

    printf("%08x\n", a1);    // 80000000  (negative)
    printf("%08x\n", a2);    // 7e000000  (positive)

    unsigned __int64 b1 = a1;
    unsigned __int64 b2 = a2;

    printf("%016llx\n", b1); // ffffffff80000000
    printf("%016llx\n", b2); // 000000007e000000
}
于 2011-04-11T22:56:48.310 に答える
0

gcc では問題なく動作し、どちらの場合も正しい番号が返されます。

サイズ 2113929216 サイズ 2080374784

printfのバグでしょうか?MSVC などを使用していますか? デバッガーをステップ実行して、各評価の後に違いを調べてください。数値が正しいように見える場合は、printf の問題である可能性があります。ただし、Linux の gcc では正しいです。

于 2011-04-11T22:59:27.037 に答える