Is comparing signed and unsigned integer safe?(比较带符号整数和无符号整数安全吗?)
问题描述
在此代码示例中使用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;如果没有充分的理由担心这些警告,是否有历史原因,为什么这些信息在过去可能对开发人员有用?
不适用。
这篇关于比较带符号整数和无符号整数安全吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:比较带符号整数和无符号整数安全吗?
基础教程推荐
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01