Bit shift compiler bug or a corner case?
Ian Lance Taylor
iant@google.com
Thu Nov 24 10:37:00 GMT 2011
Rohit Garg <rpg.314@gmail.com> writes:
> The following code outputs 0,1,32,33. Which is counter intuitive to
> say the least. But if I replace the literal 1 with the type annonated
> constant "ONE", the loop runs fine and outputs 0 and 1, which is what
> I would expect.
>
> This is with gcc 4.6.2 and -std=c++0x.
>
> #include<iostream>
> #include<cstdint>
> using namespace std;
> int main()
> {
> int64_t bitmask = 3;
> int64_t k;
> const int64_t ONE = 1;
> cout<<"bitmask = "<<bitmask<<endl;
>
> for(k=0; k<64; k++)
> {
> if(bitmask & (1<<k))
> {
> cout<<"k="<<k<<endl;
> }
> }
>
> return 0;
> }
The number 1 has type int, which on your system is probably 32 bits. In
C, using a shift which is larger than the size of the integer is
undefined behaviour. When a program uses undefined behaviour, the
results are often surprising and counter intuitive.
When you use ONE, with type int64_t, the value has 64 bits and all the
shifts are well defined.
Ian
More information about the Gcc-help
mailing list