This is because of the various implicit type conversion rules in C. There are two of them that a C programmer must know: the usual arithmetic conversions and the integer promotions (the latter are part of the former).
In the char case you have the types (signed char) == (unsigned char)
. These are both small integer types. Other such small integer types are bool
and short
. The integer promotion rules state that whenever a small integer type is an operand of an operation, its type will get promoted to int
, which is signed. This will happen no matter if the type was signed or unsigned.
In the case of the signed char
, the sign will be preserved and it will be promoted to an int
containing the value -5. In the case of the unsigned char
, it contains a value which is 251 (0xFB ). It will be promoted to an int
containing that same value. You end up with
if( (int)-5 == (int)251 )
In the integer case you have the types (signed int) == (unsigned int)
. They are not small integer types, so the integer promotions do not apply. Instead, they are balanced by the usual arithmetic conversions, which state that if two operands have the same "rank" (size) but different signedness, the signed operand is converted to the same type as the unsigned one. You end up with
if( (unsigned int)-5 == (unsigned int)-5)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…