C# 为什么int和uint比较在一种情况下失败,而在另一种情况下却没有失败?
考虑以下计划:C# 为什么int和uint比较在一种情况下失败,而在另一种情况下却没有失败?,c#,.net,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
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到无符号整数的转换为0xFFFFFF时第一次比较失败?(当第二个通过时)在第二种情况下,您将-1强制转换为uint,得到0xffffff,因此它与预期匹配。显然,在第一种情况下,比较是以两个值具有适当范围的格式进行的,允许它们不匹配的数学上正确的结果。您的第一次比较将基于长。。。因为0xFFFFFF不是int值:)
试着写
Console.WriteLine( (long)i == 0xFFFFFFFF ? "Matches" : "Doesn't match" );
您将得到一条
强制转换是冗余的
消息否,0xFFFFFFFF是uint值。。。试试看:0xffffff.GetType().Name
@Thomas:好的,你说得对。重点是:它不是在int。。。编辑在i==0xFFFFFFFF上有一个编译器警告,表示“与整数值的比较是无用的;常量超出了int的范围”。那么@tanascius是怎么说的呢?当我编译这个有问题的程序时,我没有收到任何警告。我的警告级别设置为4。我错过什么了吗?(使用VS 2008、.NET 3.5)