1

一些数据存储在 64 位整数中。如您所见,在getDrvAns函数内部,我检查该位置的位 drvIdx-1是否为01。人们无法确定drvIdx将有一个正确范围内的值(1-64)。但是,我注意到,如果我们将值设置为高于 64,则会产生环绕效果,如下面的代码所示。

我的问题是,这是标准行为吗?在没有边界检查的情况下保持原样是否安全?

注意:如果该位设置为0驱动器已应答。

uint64_t mDrvAns = 48822;

bool getDrvAns(int drvIdx) {
  std::bitset<64> bitRepOfmDrvAns{mDrvAns};
  return (bitRepOfmDrvAns[drvIdx - 1] != 0ull);
};

std::string yesOrNo(bool val) {
  return ((val==false) ? "Yes" : "No");
}

int main()
{
  int drvIdx = 1;
  std::bitset<64> bitsOfDrvAns{mDrvAns};
  std::cout << bitsOfDrvAns << std::endl;
  std::cout << "Has drv " << drvIdx << " answered? " << yesOrNo(getDrvAns(drvIdx))
        << std::endl;
  drvIdx = 65;
  std::cout << "Has drv " << drvIdx << " answered? " << yesOrNo(getDrvAns(drvIdx))
        << std::endl; 
  return 0;
}
4

1 回答 1

1

根据文档operator[],使用未定义行为的越界访问。不要这样做。

如果您不想自己检查边界,请test()改为调用,并准备好在必要时处理异常。

于 2021-11-19T12:41:01.023 回答