#include<stdio.h>
int main(void)
{
char c = 0x80;
printf("%d\n", c << 1);
return 0;
}
The output is -256
in this case. If I write c << 0
then the output is -128
.
I don't understand the logic behind this code.
char
may be signed on your platform, in which case 0x80
represents -128 (assuming two's complement).
When a char
is used as an operand with the <<
operator, it is promoted to int
(still -128). So when you apply the left-shift, you get -256. Technically, shifting negative values is implementation-defined undefined, but what you see is typical behaviour.
Already your starting point is problematic:
char c = 0x80;
If (as seemingly in your case) char
is a signed type, you are assigning the integer constant 128
to a type that is only guaranteed to hold values up to 127
. Your compiler then may choose to give you some implementation defined value (-128
in your case I guess) or to issue a range error.
Then you are doing a left shift on that negative value. This gives undefined behavior. In total you have several implementation defined choices plus undefined behavior that determine the outcome:
char
128
to signed char
char
int
(there are three possibilities)int
It may be a good exercise for you to look up all these case an to see what the different outcomes may be.
In summary some recommendations:
char
c
is assigned 0x80
. Assuming 8-bit bytes, its value in binary representation, is 10000000
. Apparently, on your platform, char
is a signed type. So, 0x80
(i.e. 10000000
) corresponds to -128.
When <<
is applied to a char
value, it is promoted to int
and the sign is preserved. So, when shifted once to the left, with 32-bit integers, it becomes 11111111111111111111111100000000
(two's complement) which is -256.
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