Yeah "long" is short for "long int", int's don't do negative values instead they set the highest bit to '1' and process the rest of the number in reverse.
Because you can't compare a negative integer to an unsigned integer. An unsigned integer can never be equal to -1 because it has no sign (no + or -; it is always positive). The only way to compare an unsigned integer with a signed integer is to cast one of them to the same type as the other one -- as Disch said, unsigned long is larger than long, so the compiler casts the long integer to an unsigned long integer. The value of (unsignedlong)-1 is 0xFFFFFFFF. unsigned integer values wrap around, so -1 is equal to 0xFFFFFFFF, -2 is equal to FFFFFFFE, and so on.