gpt4 book ai didi

c++ - 了解 int 存储多长时间?

转载 作者:太空狗 更新时间:2023-10-29 20:22:18 26 4
gpt4 key购买 nike

我正在运行以下程序:(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;
}

这个程序给我的输出是:

 68719476736
Positions where bits are set :
31
63

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

我有一个观察,如果我们使用 N=2^{exp} where exp >= 32 它总是给出 set bit 的位置为 31 和 63。任何人都可以解释为什么会这样吗?

最佳答案

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

这是我对原因的猜测:

  1. 何时j变为 31,1位来到符号位。
  2. 看到符号位为1,与N进行按位与运算,该值经过符号扩展,因此从第 31 位到第 63 位(从 0 开始)的位变为 1。
  3. N 中的第 36 位(从 0 开始)为 1,因此按位与的结果将为非零。
  4. 条件被评估为真并打印数字。
  5. 何时j是 63,如果你使用 IA-32 CPU,要移动的宽度被屏蔽为 5 位,所以它会被解释为 31 并且会发生同样的事情。

要避免这种未定义的行为,请使用 unsigned long long值(value)转移像1ull<<j .请注意,使用 long long不好,因为移动了 1位到符号位调用未定义的行为

关于c++ - 了解 int 存储多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38553364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com