为什么int和uint比较在一种情况下失败,而在另一种情况下不能?
问题描述:
考虑下面的程序:为什么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的第一比较失败? (而第二个通过)
答
你的第一个比较将基于多头...因为0xFFFFFFFF的是不是一个int值:)
尝试写
Console.WriteLine((long)i == 0xFFFFFFFF ? "Matches" : "Doesn't match");
,你会得到一个cast is redundant
消息
答
在第二种情况下,您将-1投入到uint中,得到0xFFFFFFFF,因此它与预期相符。在第一种情况下,显然比较是以适合两种值的范围的格式完成的,从而允许数学上正确的结果,它们不匹配。
不,是为0xFFFFFFFF一个uint值...只是尝试:'0xFFFFFFFF.GetType()。Name' – 2010-03-05 13:33:18
@Thomas:好的,你说得对。重点是:它不是int ...编辑 – tanascius 2010-03-05 13:36:07
在i == 0xFFFFFFFF上有一个编译器警告,说“比较到整数值没用,常量在int的范围之外”。所以@tanascius说。 – btlog 2010-03-05 14:09:31