Integer promotion with the operator <<
The phrase "the integer promotions" is a very specific thing, found in (for C99) section 6.3.1.1 Booleans, characters, and integers
:
If an
int
can represent all values of the original type, the value is converted to anint
; otherwise, it is converted to anunsigned int
. These are called the integer promotions. All other types are unchanged by the integer promotions.
So assuming your unsigned char
can be held in an int
, it will be promoted to an int
. On those rare platforms where unsigned char
is as wide as an int
, it will promote to an unsigned int
.
This is only changed slightly in C11:
If an
int
can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to anint
; otherwise, it is converted to anunsigned int
. These are called the integer promotions. All other types are unchanged by the integer promotions.
If a specific compiler doesn't follow this behaviour, then it's not really conforming. However, given that the compiler you listed is for embedded systems, it's not really surprising.
Many are built for specific purposes and conformance is not always high on the list of requirements. There may be compiler flags that will allow it to more closely conform to the standard.
Looking at your particular environment, the M16C Series,R8C Family C Compiler Package V.5.45 C Compiler
has, in section 2.1.4 nc30 Command Line Options
, subsection f. Generated code modification options
:
-fextend_to_int
,-fETI
: Performs operation after extendingchar
-type data to theint
type. Extended according to ANSI standards.
although I suspect -fansi
is probably a better choice since it covers a few other things as well.
value8
is promoted to int
, assuming the conversion rank of unsigned char
is lower than the conversion rank of int
(usually the case on most platforms).
The conversion ranks of integers are described in C99 in 6.3.1.1.
Note that some compilers disable the integer promotions rules by default. For example, MicroChip compiler MPLAB C18. Look for ISO conformance in the documentation of your compiler.