Ошибка компилятора с битовым сдвигом или крайний случай?

Следующий код выводит 0,1,32,33. Что, мягко говоря, противоречит интуиции. Но если я заменю литерал 1 константой с анонированием типа «ONE», цикл будет работать нормально.

Это с 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;
    } 

РЕДАКТИРОВАТЬ Вопрос: Как заметил Бен, 1 по умолчанию имеет ширину 32 бита. Почему он не повышается до 64 бит, если его совместная работа составляет 64 бита.

РЕШЕНИЕ

Нет. << не требует, чтобы каждая сторона имела один и тот же тип. В конце концов, зачем делать правую часть int64_t, если максимальный доступный сдвиг умещается в char? Продвижение происходит только тогда, когда вы имеете дело с арифметическими операторами, а не со всеми операторами.

Скопировано из комментариев Билла ниже

5
задан rpg 24 November 2011 в 06:33
поделиться