Reputation: 19826
Consider following program:
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 ();
}
The output of above program is:
Doesn't match
Matches
Why the first comparison fails when unchecked conversion of integer -1 to unsigned integer is 0xFFFFFFFF? (While the second one passes)
Upvotes: 5
Views: 2269
Reputation: 53944
Your first comparison will be based on longs ... since 0xFFFFFFFF is not an int value :)
Try to write
Console.WriteLine( (long)i == 0xFFFFFFFF ? "Matches" : "Doesn't match" );
and you will get a cast is redundant
message
Upvotes: 6
Reputation: 10430
In the second case you cast -1 into uint, getting 0xFFFFFFFF, so it matches as expected. In the first case apparently the comparison is done in a format with suitable range for both values, allowing for the mathematically correct result that they do not match.
Upvotes: 2