比较带符号整数和无符号整数安全吗?
在此代码示例中使用int
而不是std::size_t
时
std::vector<int> v {1,2,3,4};
for(int i = 0; i < v.size(); i++)
{
std::cout << v[i] << " ";
}
编译器生成以下警告:
warning: comparison between signed and unsigned integer expressions
但是,程序按预期运行并输出:
1 2 3 4
我还注意到,在我正在工作的项目中,这些警告经常出现,这些警告已经投入生产多年,而这些警告从未给我们的客户带来任何问题。由于这些程序显然不存在比较有符号和无符号整数的问题,我想问:
- 在适用的情况下,始终使用无符号覆盖有符号整数在性能或安全方面是否有任何好处?
- 比较带符号整数和无符号整数在什么情况下(如果有)会导致错误或意外行为?
- 如果没有充分的理由担心这些警告,是否有任何历史原因,为什么这些信息在过去可能对开发人员有用?
解决方案
将无签名与已签名进行比较可能会出现严重问题,例如
std::string( "Bah" ).size() < -5
&hellip;将始终为真。
这就是为什么您会收到警告,但编译器在分配的时间范围内不够聪明,无法确保任何特定的此类比较是安全的。
现在进入要点问题。
&rdq;在适用的情况下,始终使用无符号覆盖有符号整数在性能或安全方面是否有任何好处?
是,为了正确起见,避免使用UB。但,&ldq;可应用&rdq;是您执行位级别操作的地方。对于数字,始终首选有符号整型或浮点型。
比较带符号整数和无符号整数在什么情况下(如果有)会导致错误或意外行为?
涉及无符号环绕时,通常通过隐式将操作数从有符号提升到无符号。
&rdq;如果没有充分的理由担心这些警告,是否有历史原因,为什么这些信息在过去可能对开发人员有用?
不适用。
相关文章