[英]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.