Joe said:

What bad things could happen if I compare signed and unsigned integers?

(is that even valid C?)

Second question first: Yes, it is valid. The operands are

subject to the "usual arithmetic conversions" (6.3.1.8), which

reconcile them to a common type. The comparison is then carried

out in that common type.

First question second: The usual arithmetic conversions may

result in a type that is surprising to the novice, changing the

"obvious" meaning of the expression:

int i = -1;

unsigned int u = i + 1;

if (u > i) ...

Clearly, u is initialized to a value greater than that of i:

after all, i is negative and u is zero, so u must be greater

than i, right? Not so, Grasshopper: after the "usual arithmetic

conversions" (which in this case convert both operands to

unsigned int), the converted i will be UINT_MAX, much *larger*

than u. If you don't understand what's happening, the result

might be a "bad thing."