usual arithmetic conversion in C

Implicit arithmetic conversions work much as expected. In general, if an operator like + or *
that takes two operands has operands of different types, the "lower" type is promoted to the "higher"' type before the operation proceeds. The result is of the integer type. If there are no unsigned operands, however, the following informal set of rules will suffice:
* If either operand is long double, convert the other to long double.
* Otherwise, if either operand is double, convert the other to double.
* Otherwise, if either operand is float, convert the other to float.
* Otherwise, convert char and short to int.
* Then, if either operand is long, convert the other to long.

Conversion rules are more complicated when unsigned operands are involved. The problem is that comparisons between signed and unsigned values are machine-dependent, because they depend on the sizes of the various integer types.