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;`