Poniższy kod wyprowadza 0,1,32,33. Co najmniej sprzeczne z intuicją. Ale jeśli zastąpię literał 1 typem annonated constant "ONE", pętla działa dobrze.Błąd kompilatora bitowego lub narożnik?
Jest to z gcc 4.6.2 i -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 Pytanie: Jako Ben zauważył, 1 jest postrzegane jako 32 bitowe domyślnie. Dlaczego nie jest promowany do 64 bitów, gdy współoperant ma 64 bity.
ROZWIĄZANIE
nr < < nie wymaga, aby z każdej strony tego samego typu. W końcu dlaczego ustawić prawą stronę na int64_t, gdy maksymalna dostępna zmiana pasuje do znaku? Promocja występuje tylko wtedy, gdy masz do czynienia z operatorami arytmetycznymi, a nie wszystkimi operatorami.
Skopiowane z uwag Billa poniżej
możliwy duplikat [Jak mogę zmienić nieco bit o ponad 32 bity?] (Http://stackoverflow.com/questions/2404439/how-do-i-bit- shift-a-long-by- więcej niż 32-bitów) –