2010-03-05 197 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,因此它与预期相符。在第一种情况下,显然比较是以适合两种值的范围的格式完成的,从而允许数学上正确的结果,它们不匹配。

相关问题