64位变量在c ++中奇怪地起作用

时间:2018-04-19 05:57:38

标签: c++ bits

为什么64位变量在真正的位进入第31位并且进一步变得非常有效?在第32位,它返回一个非常大的值然后重置。

#include <iostream>
using namespace std;
int a[65];
int main()
{
a[0]=1;
for(int i=0;i<=63;++i)
{
    for(int k=7;k>=0;--k)
    {
     for(int j=7;j>=0;--j)
    cout<<a[k*8+j];
    cout<<' ';
    }
    cout<<'=';
    cout<<(unsigned long long)(1<<i);
    cout<<'\n';
        a[i]=0;
        a[i+1]=1;
}
return 0;
}

2 个答案:

答案 0 :(得分:6)

(unsigned long long)(1<<i);

1此处仍为int。您将(1<<i)的结果投放到unsigned long long

使用

cout<<((unsigned long long)1<<i);

或只是

cout<<(1ULL<<i);

答案 1 :(得分:0)

您要转换(1<<i)的结果:

((unsigned long long)1<<i);

甚至更简单:

(ull1<<i); 

其中ull使文字1类型为unsigned long long。

如果您没有约束或特定要求,我也会建议使用不同但更简单的代码:

#include <bitset>
#include<iostream>

int main()
{
    unsigned long long a = 1;

    for(int i=0;i<=63;++i)
    {
        std::cout << std::bitset<64> (a) << " = " << a << "\n";
        a = a << 1;
    }
}