2013-05-07 97 views
3

我看到一些奇怪的行爲,使用msdev 2010的__int64類型。任何人都可以告訴我發生了什麼? 我想有2個問題在這裏,首先如何顯示64位整數,其次行爲 - 即爲什麼它看起來像__int64實際上是一個32位INT ......如預期printf 64位類型說明符問題

#include <stdio.h> 

int main() 
{ 
    int vl_idx; 
    unsigned __int64 vl_64; 
    unsigned __int64 vl_64_test; 

    for (vl_idx = 0; vl_idx < 64; vl_idx++) 
    { 
    vl_64 = 1 << vl_idx; 
    printf ("vl_64 (%d) = %I64u\n", vl_idx, vl_64); 
    printf ("vl_64 (%d) = %llu\n", vl_idx, vl_64); 
    printf ("vl_64 (%d) = %lu\n", vl_idx, vl_64); 
    } 
    vl_64_test = 1 << 31; 
    if (vl_64 > vl_64_test) 
    printf ("greater\n"); 
    if (vl_64 == vl_64_test) 
    printf ("equal\n"); 
    if (vl_64 < vl_64_test) 
    printf ("less\n"); 

    return 0; 
} 

輸出的第30次迭代:

vl_64 (0) = 1 
vl_64 (0) = 1 
vl_64 (0) = 1 
vl_64 (1) = 2 
vl_64 (1) = 2 
vl_64 (1) = 2 
... 
vl_64 (30) = 1073741824 
vl_64 (30) = 1073741824 
vl_64 (30) = 1073741824 
vl_64 (31) = 18446744071562067968 
vl_64 (31) = 18446744071562067968 
vl_64 (31) = 2147483648 
vl_64 (32) = 1 
vl_64 (32) = 1 
vl_64 (32) = 1 
vl_64 (33) = 2 
vl_64 (33) = 2 
vl_64 (33) = 2 
... 
vl_64 (62) = 1073741824 
vl_64 (62) = 1073741824 
vl_64 (62) = 1073741824 
vl_64 (63) = 18446744071562067968 
vl_64 (63) = 18446744071562067968 
vl_64 (63) = 2147483648 
equal 

但是,那麼事情?溢出?在第32次迭代。這可能只是一個顯示問題,但最後的比較表明不然。 這是用msdev 2010 cl(64位版本)編譯並在64位windows操作系統(64位CPU)上運行。任何建議,爲什麼比較說明1 < < 31 == 1 < < 63?

感謝您的任何建議,

吉姆

回答

1

你有什麼比int更寬,例如打交道時需要小心整數文字您需要更改:

vl_64 = 1 << vl_idx; 

到:

vl_64 = 1LLU << vl_idx; 

否則右手側被評價爲int表達首先被隱式轉換爲無符號的64位結果之前。

+0

是的,就是這樣。感謝那。 MS似乎並不瞭解1LLU,但是如果我將1轉換爲(無符號__int64),它會達到同樣的效果 - 輸出如預期。 – 2013-05-07 10:59:01