为什么int和uint比较在一种情况下失败但在另一种情况下没有?

时间:2010-03-05 13:27:05

标签: c# .net

考虑以下计划:

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? (虽然第二个过去了)

2 个答案:

答案 0 :(得分:5)

您的第一次比较将基于long ...因为0xFFFFFFFF不是int值:) 试着写

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

您将收到cast is redundant消息

答案 1 :(得分:1)

在第二种情况下,你将-1转换为uint,得到0xFFFFFFFF,因此它按预期匹配。在第一种情况下,显然比较是以两种值的适当范围的格式进行的,从而允许数学上不正确的结果。