what does it mean to bitwise left shift an unsigned char with 16

bit-manipulation, c, c++

Solution

When you shift a value,

unsigned char x = ...;
int y = x << 16;

The type of `x` is promoted to `int` if `unsigned char` fits in an `int` (most systems), or to `unsigned` if `unsigned char` does not fit in an `int` (rare1). As long as your `int` is 25 bits wide or wider, then no data will be discarded2.

Note that this is completely unrelated to the fact that `16` has type `int`.

/* All three are exactly equivalent */
x << 16;
x << 16u;
x << (unsigned char) 16;

Source: from n1516 (C99 draft):

§6.5.7 paragraph 3: Bitwise Shift Operators

The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand.

§6.3.1.1 paragraph 2: Boolean, characters, and integers

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 an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.

Footnotes:

1: Some DSP chips as well as certain Cray supercomputers are known to have `sizeof(char) == sizeof(int)`. This simplifies design of the processor's load-store unit at the cost of additional memory consumption.

2: If your left shift is promoted to `int` and then overflows the `int`, this is undefined behavior (demons may fly out your nose). By comparison, overflowing an `unsigned` is always well-defined, so bit shifts should usually be done on `unsigned` types.

Problem

i am reading a .cpp file containing a `unsigned char` variable, it's trying the bitwise left shift 16 bits, since an `unsigned char` is composed of 8 bits, left shift 16 bits will erase all the bits and fill it with eight 0s. `unsigned char byte=0xff; byte << 16;`

Original source

Related problems