main() {
if ( -1 < (unsigned char) 1 )
printf(\"less than\");
else
printf(\"NOT less than\");
}
Prints less than<
This is due to integer promotions. Both arguments can be represented as an int, so they are converted to an int.
ISO C 6.3.1.1, paragraph 2:
If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.48) All other types are unchanged by the integer promotions.