I'm very new to dealing with bits and have got stuck on the following warning when compiling:
7: warning: left shift count >= width of type
My line 7 looks like this
unsigned long int x = 1 << 32;
This would make sense if the size of long
on my system was 32 bits. However, sizeof(long)
returns 8
and CHAR_BIT
is defined as 8
suggesting that long should be 8x8 = 64 bits long.
What am I missing here? Are sizeof
and CHAR_BIT
inaccurate or have I misunderstood something fundamental?
unsigned long
is 32 bit or 64 bit which depends on your system.unsigned long long
is always 64 bit. You should do it as follows:unsigned long x = 1UL << 31;
Not show the error message. Because before you specify the 32, is not true because only limited to 0-31.
You can use something like that:
long
may be a 64-bit type, but1
is still anint
. You need to make1
along int
using theL
suffix:(You should also make it
unsigned
using theU
suffix as I've shown, to avoid the issues of left shifting a signed integer. There's no problem when along
is 64 bits wide and you shift by 32 bits, but it would be a problem if you shifted 63 bits)You can't shift a value to its max bit
So, this generates the warning
left shift count >= width of type (i.e type = int = 32 )