是否有必要检查位表示 C++ 中的范围
Is it necessary to check range in bit representation C++
部分数据以 64 位整数形式存储。如您所见,在 getDrvAns
函数中,我检查位置 drvIdx-1
中的位是 0
还是 1
。无法确定 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;
}
根据 documentation,使用 operator[]
的越界访问是未定义的行为。别这样。
如果您不想自己检查边界,请改为调用 test()
,并在必要时准备好处理异常。
部分数据以 64 位整数形式存储。如您所见,在 getDrvAns
函数中,我检查位置 drvIdx-1
中的位是 0
还是 1
。无法确定 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;
}
根据 documentation,使用 operator[]
的越界访问是未定义的行为。别这样。
如果您不想自己检查边界,请改为调用 test()
,并在必要时准备好处理异常。