在此代码示例中使用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
我也经常在我正在进行的项目中注意到这些警告,这些项目已经在生产中运行了多年,而那些警告从未导致客户方出现任何问题。由于显然这些程序在比较有符号和无符号整数方面没有问题,我想问:
答案 0 :(得分:3)
将unsigned与signed 进行比较会出现严重问题,例如
std::string( "Bah" ).size() < -5
......永远都是真的。
这就是你收到警告的原因,但编制者在分配的时间框架内并不够聪明,看看任何特定的比较都是安全的。
现在提到你的要点问题。
“在任何情况下始终使用无符号有符号整数是否有任何好处,性能或安全性?
是的,为了正确,避免UB。 但是,“适用”是你做位数事情的地方。对于数字,总是更喜欢有符号整数或浮点类型。
“在什么情况下(如果有的话)比较有符号和无符号整数会导致错误或意外行为?
当涉及无符号环绕时,通常通过隐式提升操作数从signed到unsigned。
“如果没有充分的理由担心这些警告,是否有任何历史原因,为什么这些信息过去对开发人员有用?
不适用。
答案 1 :(得分:0)
在您开始比较负数之前,这是安全的。
无符号整数可以保持正常int的两倍,但不能保持 负值。