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;如果没有充分的理由担心这些警告,是否有历史原因,为什么这些信息在过去可能对开发人员有用?
不适用。
这篇关于比较带符号整数和无符号整数安全吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:比较带符号整数和无符号整数安全吗?


- 将 hdc 内容复制到位图 2022-09-04
- 如何提取 __VA_ARGS__? 2022-01-01
- XML Schema 到 C++ 类 2022-01-01
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01
- GDB 不显示函数名 2022-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- DoEvents 等效于 C++? 2021-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01