了解long int存储多长时间?

AnS*_*nSh 3 c++

我正在运行以下程序:(URL:http://ideone.com/aoJoI5)

  #include <iostream>
  #include <cmath>
  using namespace std;
  int main()
  {
     long long int N=pow(2, 36);
     cout << N <<endl;
     int count = 0;
     cout << "Positions where bits are set : " << endl;
     for(int j=0; j<sizeof(long long int)*8; ++j){
     if(N&(1<<j)){
        ++count;
        cout << j << endl;
     }
   }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序给我输出为:

 68719476736
 Positions where bits are set : 
 31
 63
Run Code Online (Sandbox Code Playgroud)

现在我正在使用N = 2 ^ 36,这意味着第36位应该是1而没有别的,但为什么程序给我位置31和63?我的程序有什么问题吗?

我有一个观察结果,如果我们使用N = 2 ^ {exp},其中exp> = 32,它总是给出设置位的位置为31和63.任何人都可以解释为什么会发生这种情况?

Mik*_*CAT 6

如果int是32位长,1<<j则会进行过多的移位并调用未定义的行为.

以下是我对原因的猜测:

  1. j变为31时,该1位到达符号位.
  2. 看到符号位为1,要按位计算AND N,则值被符号扩展,因此从第31位到第63位(0-原点)的位变为1.
  3. 第36位(0-origin)in N为1,因此按位AND的结果将为非零.
  4. 条件评估为真,并打印数字.
  5. j为63时,如果使用IA-32 CPU,则要移位的宽度将被屏蔽为5位,因此它将被解释为31并且会发生同样的事情.

要避免这种未定义的行为,请使用unsigned long long值来移动1ull<<j.请注意,使用long long不好,因为将位移1位到符号位会调用未定义的行为.