If char
is equivalent to signed char
:
char
is promoted to int
(Integer Promotions, ISO C99 §6.3.1.1 ?2)
- Since
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
:
- If
int
can represent all unsigned char
values (typically because sizeof(int) > sizeof(char)
), char
is converted to int
.
- Otherwise (typically because
sizeof(char)==sizeof(int)
), char
is converted to unsigned
.
- Now we have one operand that is either
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).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…