Cartesius00
Cartesius00

Reputation: 24364

Compare int and unsigned int

If one needs to compare int x with unsigned int y which is safer/better/nicer in C99 and with gcc 4.4+:

  1. (unsigned int)x == y
  2. x == (int)y

Does it matter?

Upvotes: 12

Views: 39217

Answers (2)

undur_gongor
undur_gongor

Reputation: 15954

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.

Upvotes: 9

Mark Byers
Mark Byers

Reputation: 837996

Safest is to check that the number is in range before casting:

if (x >= 0 && ((unsigned int)x) == y)

Upvotes: 17

Related Questions