簡體   English   中英

來自unsigned_int64的異常行為;

[英]Unexpected behavior from unsigned_int64;

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

第一個#非常大。 第二個數字是正確答案。 從62更改為63怎么引起這種變化?

第一個值是18446744071562067968第二個值是2113929216

抱歉,值是64和63,而不是63和62。

除非另有限定,否則整數文字的類型為int 我假設在您使用的平台上, int是32位的。 因此計算(64*33554432)溢出並變為負數。 然后,將其unsigned __int64轉換為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
}

在gcc上,它可以正常工作,並且在兩種情況下都能給出正確的數字。

尺寸2113929216尺寸2080374784

可能是printf的錯誤嗎? 您使用的是MSVC還是類似的產品? 嘗試逐步通過調試器,並在每次評估后檢查差異。 如果數字看起來正確,那可能只是一個printf問題。 但是,在Linux上的gcc下是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM