I’m getting results from left shift to which I could not find an explanation.
unsigned char value = 0xff; // 1111 1111
unsigned char = 0x01; // 0000 0001
std::cout << "SIZEOF value " << sizeof(value) << "\n"; // prints 1 as expected
std::cout << "SIZEOF shift " << sizeof(shift) << "\n"; // prints 1 as expected
std::cout << "result " << (value << shift) << "\n"; // prints 510 ???
std::cout << "SIZEOF result " << sizeof(value << shift) << "\n"; // prints 4 ???
I was expecting result to be 1111 1110 but instead I get int(?) with value of 1 1111 1110.
How can the bits of an unsigned char be shifted to the left so that bits are truncated and the result is 1111 1110?
What I’m trying to do is to read series of bytes and interpret them as integers of varying lengths (1-32 bits).
F0 F5
1111 0000 1111 0101
could be
0F (first 4 bits)
0F (next 8 bits)
05 (last 4 bits)
Has this something to do with the fact that arithmetic is not done with types smaller than int?
Quoting some draft of the 2011 standard:
and
So,
valueis promoted toint, and the type ofvalue << shiftis the type of the promoted left operand, i.e.int.You can achieve your desired result one of these ways: