main() {
unsigned x = 1;
char y = -1;
if (x > y)
printf("x>y");
else
printf("x<=y");
}
I expected x>y
,
but I had to change unsigned int
to signed int
to get the expected result.
If char
is equivalent to signed char
:
char
is promoted to int
(Integer Promotions, ISO C99 §6.3.1.1 ¶2)int
and unsigned int
have the same rank, int
is converted to unsigned int
(Arithmetic Conversions, ISO C99 §6.3.1.8)If char
is equivalent to unsigned char
:
char
may be promoted to either int
or unsigned int
:
int
can represent all unsigned char
values (typically because sizeof(int) > sizeof(char)
), char
is converted to int
.sizeof(char)==sizeof(int)
), char
is converted to unsigned
.int
or unsigned int
, and another that is unsigned int
. The first operand is converted to unsigned int
.Integer promotions:
An expression of a type of lower rank that int
is converted to int
if int
can hold all of the values of the original type, to unsigned int
otherwise.
Arithmetic conversions: Try to convert to the larger type. When there is conflict between signed and unsigned, if the larger (including the case where the two types have the same rank) type is unsigned, go with unsigned. Otherwise, go with signed only in the case it can represent all the values of both types.
Conversions to integer types(ISO C99 §6.3.1.3):
Conversion of an out-of-range value to an unsigned integer type is done via wrap-around (modular arithmetic).
Conversion of an out-of-range value to a signed integer type is implementation defined, and can raise a signal (such as SIGFPE).
When using signed and unsigned in single operation the signed got promoted to unsigned by C's automatic type conversion. If the bit patter of -1
is considered an unsigned number then it is a very very high value. So x > y
is false.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With