Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bitwise shift operation in C on uint64_t variable

I have the following sample code:

uint64_t x, y;
x = ~(0xF<<24);
y = ~(0xFF<<24);

The result would be:

x=0xfffffffff0ffffff
y=0xfffff

Can anyone explain the difference? Why x is calculated over 64 bit and y only on 32?

like image 298
alnet Avatar asked Dec 21 '22 02:12

alnet


1 Answers

The default operation is 32 bit.

x=~(0xf<<24);

This code could be disassembled into the following steps:

int32_t a;
a=0x0000000f;
a<<=24;   // a=0x0f000000;
a=~a;     // a=0xf0ffffff;
x=(uint64_t)a;  // x = 0xfffffffff0ffffff;

And,

y = ~(0xFF<<24);

int32_t a;
a=0x000000ff;
a<<=24;   // a=0xff000000;
a=~a;     // a=0x00ffffff;
x=(uint64_t)a;  // x = 0x000000000ffffff;
like image 142
ciphor Avatar answered Dec 24 '22 00:12

ciphor