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;
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With