"有符号和无符号整数表达式之间的比较"真的会导致错误吗?
Will 'comparison between signed and unsigned integer expressions' ever actually result in errors?
通常我使用的对象将具有(有符号的)int
参数(例如 int iSize
)最终存储某物应该有多大。 同时,我经常将它们初始化为-1
,以表示对象(等)尚未设置/尚未填充/尚未准备好使用。
当我做类似if( iSize >= someVector.size() ) { ... }
的事情时,我经常以警告comparison between signed and unsigned integer
结束。
因此,我名义上不想使用unsigned int
。 是否存在任何会导致错误或意外行为的情况?
如果没有:处理此问题的最佳方法是什么? 如果我使用编译器标志-Wno-sign-compare
我可能会(假设)错过应该使用unsigned int
(或类似的东西)的情况。 因此,在与unsigned int
进行比较时,我应该只使用演员表 - 例如 if( iSize >= (int)someVector.size() ) { ... }
?
是的,有,而且非常微妙。如果你好奇,你可以看看Stephan T. Lavavej关于算术转换的有趣演讲,以及Microsoft的STL实现中的一个错误,该错误是由有符号与无符号比较引起的。
一般来说,问题是由于这样一个事实,即由于补码 2 算术,非常小的负整数值与非常大的无符号整数值具有相同的位表示(例如 -1 = 0xFFFF = 65535
)。
在检查size()
的特定情况下,为什么不首先使用类型 size_t
进行iSize
?无符号值只是给你更大的表现力,使用它。
如果您不想将iSize
声明为 size_t
,只需使用显式强制转换来明确表示您知道此比较的性质。编译器正试图通过这些警告帮你一个忙,正如你正确写的那样,在某些情况下,忽略它们会让你非常头疼。
因此,如果iSize
有时是负数(并且应该被评估为小于size()
的所有unsigned int
值),请使用成语:if ((iSize < 0) || ((unsigned)iSize < somevector.size())) ...
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 当内存被分配到Windows中的进程中时,它总是会触发页面错误,这是真的吗
- C++的调试错误真的很令人沮丧
- "有符号和无符号整数表达式之间的比较"真的会导致错误吗?