1. ## Help! About Type Conversions

The following statement is from C Primer Plus 5th Edition.

The char and short types are promoted to type int or, if necessary, to unsigned int whenever they appear in expressions or as function arguments.
Does it mean that even in an expression like this
Code:
`c = a + b    // suppose a, b and c are variables of type char`
a and b is also converted to type int first, then they sum together, and finally the sum is converted to type char and assigned to c?

But I also find something on the web like this
When two or more operands of different types appear in an expression.
which means that a and b do not need to be converted to type int.

Which one is right?

2. C90:
3.2.1.5 Usual arithmetic conversions

Many binary operators that expect operands of arithmetic type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions: First, if either operand has type long double, the other operand is converted to long double . Otherwise, if either operand has type double, the other operand is converted to double. Otherwise, if either operand has type float, the other operand is converted to float. Otherwise, the integral promotions are performed on both operands. Then the following rules are applied: If either operand has type unsigned long int, the other operand is converted to unsigned long int. Otherwise, if one operand has type long int and the other has type unsigned int, if a long int can represent all values of an unsigned int, the operand of type unsigned int is converted to long int ; if a long int cannot represent all the values of an unsigned int, both operands are converted to unsigned long int. Otherwise, if either operand has type long int, the other operand is converted to long int. Otherwise, if either operand has type unsigned int, the other operand is converted to unsigned int. Otherwise, both operands have type int.

The values of operands and of the results of expressions may be represented in greater precision and range than that required by the type; the types are not changed thereby.
But there may be ways implementation-specific ways to circumvent this if so desired.