2010-03-05 199 views
4

考慮下面的程序:爲什麼int和uint比較在一種情況下失敗,而在另一種情況下不能?

static void Main (string[] args) { 
    int i; 
    uint ui; 

    i = -1; 
    Console.WriteLine (i == 0xFFFFFFFF ? "Matches" : "Doesn't match"); 

    i = -1; 
    ui = (uint)i; 
    Console.WriteLine (ui == 0xFFFFFFFF ? "Matches" : "Doesn't match"); 

    Console.ReadLine(); 
} 

上述程序的輸出是:

Doesn't match 
Matches 

爲什麼當整數的未經檢查的轉換-1至無符號整數是0xFFFFFFFF的第一比較失敗? (而第二個通過)

回答

5

你的第一個比較將基於多頭...因爲0xFFFFFFFF的是不是一個int值:)
嘗試寫

Console.WriteLine((long)i == 0xFFFFFFFF ? "Matches" : "Doesn't match"); 

,你會得到一個cast is redundant消息

+0

不,是爲0xFFFFFFFF一個uint值...只是嘗試:'0xFFFFFFFF.GetType()。Name' – 2010-03-05 13:33:18

+0

@Thomas:好的,你說得對。重點是:它不是int ...編輯 – tanascius 2010-03-05 13:36:07

+1

在i == 0xFFFFFFFF上有一個編譯器警告,說「比較到整數值沒用,常量在int的範圍之外」。所以@tanascius說。 – btlog 2010-03-05 14:09:31

1

在第二種情況下,您將-1投入到uint中,得到0xFFFFFFFF,因此它與預期相符。在第一種情況下,顯然比較是以適合兩種值的範圍的格式完成的,從而允許數學上正確的結果,它們不匹配。

相關問題