2011-04-11 47 views
1
unsigned__int64 difference; 
difference=(64*33554432); 
printf ("size %I64u \n", difference); 
difference=(63*33554432); 
printf ("size %I64u \n", difference); 

第一個#是可笑的大。第二個數字是正確的答案。如何將其從62更改爲63會導致此類變化?來自unsigned_int64的意外行爲;

第一值18446744071562067968 第二值2113929216

對不起的值分別爲64和63,而不是63和62

+1

你可以添加你看到的結果嗎?你還可以發佈你的*實際*代碼嗎? (這不可能,因爲沒有'difference3')。 – 2011-04-11 22:54:31

+0

糟糕,代碼非常簡單..我顯然意味着區別不區別3抱歉 – Jake 2011-04-11 23:07:11

+0

C++沒有'unsigned__int64'。您正在使用特定於實現的擴展或庫。陳述你的平臺。 – 2011-04-11 23:39:35

回答

10

除非另有合格,整數文字是int類型。我假設在你所使用的平臺上,一個int是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 
} 
+0

@Matt:這正是我暗示的。 – 2011-04-11 23:06:59

0

海合會它工作正常,並給出了在這兩種情況下正確的號碼。

大小2113929216 大小2080374784

難道是用printf的錯誤? 你使用MSVC還是類似的?嘗試通過調試器進行調試,並在每次評估後檢查差異。如果數字看起來正確,那麼它可能只是一個printf問題。然而,在Linux下的gcc是正確的。

+0

對不起,這些值是錯的...你可以用64和63試試嗎? – Jake 2011-04-11 23:00:44