Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In C Left shift (char) 0xFF by 8 and cast it to int

Tags:

c

char

signed

shift

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
like image 493
Geos Avatar asked Jul 08 '09 09:07

Geos


1 Answers

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 );
like image 79
sharptooth Avatar answered Nov 11 '22 01:11

sharptooth