C++ 位移位编译器错误还是死角?

C++ 位移位编译器错误还是死角?,c++,gcc,c++11,bit-shift,C++,Gcc,C++11,Bit Shift,以下代码输出0,1,32,33。至少可以说,这是违反直觉的。但是如果我用类型注释常量“ONE”替换文字1,循环运行良好 这是在GCC4.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&

以下代码输出0,1,32,33。至少可以说,这是违反直觉的。但是如果我用类型注释常量“ONE”替换文字1,循环运行良好

这是在GCC4.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;
    } 
#包括
#包括
使用名称空间std;
int main()
{
int64_t位掩码=3;
int64_t k;
常数int64_t ONE=1;

cout这是一个问题:
(1但是不应该将1提升为int64,因为它的合作操作数是64位宽的。如果尝试添加一个int和一个float,它肯定会将int提升为float。@rpg:No。
@rpg:No。操作数有不同的函数(一个是值,另一个是位计数)。将两个操作数强制为同一类型是没有意义的。事实上,标准要求左操作数的提升独立于右操作数的类型。@Ben:您可能应该注意“执行整数提升”并不意味着东西可以升级到
long
。@ndim:
INT64_C
可能在所有平台上都不可用。
LL
后缀总是有效的,而且不太冗长,所以我更喜欢它。可能重复的