On left shift of (char) 0xff by 8 and casting it to int we get -256 or 0xffffff00. Can somebody explain why this should happen?
#include <stdio.h>
int main (void)
{
char c = 0xff;
printf("%d %x\n", (int)(c<<8),(int)(c<<8));
return 0;
}
Output is
-256 ffffff00
char
can be signed or unsigned - it's implementation-defined. You see these results because char
is signed by default on your compiler.
For the signed char 0xFF corresponds to −1 (that's how two's complement work). When you try to shift it it is first promoted to an int
and then shifted - you effectively get multiplication by 256.
So it is this code:
char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );