Il codice seguente emette 0,1,32,33. Che è controintuitivo per non dire altro. Ma se sostituisco il letterale 1 con la costante annonata tipo "UNO", il ciclo funziona correttamente.Bug del compilatore di bit shift o caso d'angolo?
Questo è con gcc 4.6.2 e -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;
}
EDIT Domanda: Come Ben sottolineato, 1 è visto ad essere a 32 bit di larghezza per impostazione predefinita. Perché non viene promosso a 64 bit quando il co-operando è a 64 bit.
SOLUZIONE
No. < < non richiede che ogni lato hanno lo stesso tipo. Dopo tutto, perché rendere il lato destro un int64_t quando il massimo spostamento disponibile si inserisce in un char? La promozione si verifica solo quando hai a che fare con operatori aritmetici, non con tutti gli operatori.
Copiato da commenti di Bill sotto
possibile duplicato di [Come faccio a muovere un po 'più a lungo di oltre 32 bit?] (Http://stackoverflow.com/questions/2404439/how-do-i-it-shift-a-long-by- più-di-32-bit) –