Следующий код выводит 0,1,32,33. Что нелогично, если не сказать больше. Но если я заменю литерал 1 константой типа «ОДИН», цикл будет работать нормально.
Это с gcc 4.6.2 и -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
Вопрос: Как отметил Бен, по умолчанию 1 равен 32-битной ширине. Почему это не повышается до 64 бит, когда его кооператив 64-битный.
РЕШЕНИЕ
Нет. << не требует, чтобы каждая сторона имела одинаковый тип. В конце концов, зачем делать правую сторону int64_t, когда максимальный доступный сдвиг вписывается в символ? Продвижение происходит только тогда, когда вы имеете дело с арифметическими операторами, а не со всеми операторами. </p>
Скопировано из комментариев Билла ниже