If one needs to compare int x with unsigned int y which is safer/better/nicer in C99 and with gcc 4.4+:
Yes, it does matter.
On a platform with 32bit int with e.g.
int x = -1;
unsigned y = 0xffffffff;
the expression x == y would yield 1 because through the "usual arithmetic conversions" the value of x is converted to unsigned and thus to 0xffffffff.
The expression (unsigned int)x == y is 1 as well. The only difference is that you do the conversion explicitly with a cast.
The expression x == (int)y will most likely be 1 as well because converting 0xffffffff to int yields -1 on most platforms (two's complement negatives). Strictly speaking this is implementation-defined behavior and thus might vary on different platforms.
Note that in none of the cases you will get the "expected" result 0. A good implementation is given in Mark Byers' answer.
Safest is to check that the number is in range before casting:
if (x >= 0 && ((unsigned int)x) == y)