比较有符号和无符号整数是否安全?

时间:2017-03-07 11:10:32

标签: c++ compiler-warnings

在此代码示例中使用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

我也经常在我正在进行的项目中注意到这些警告,这些项目已经在生产中运行了多年,而那些警告从未导致客户方出现任何问题。由于显然这些程序在比较有符号和无符号整数方面没有问题,我想问:

  • 在适用的情况下始终使用无符号有符号整数是否有任何好处,性能或安全性?
  • 在什么情况下,如果有的话,比较有符号和无符号整数会导致错误或意外行为吗?
  • 如果没有充分的理由担心这些警告,是否有任何历史原因,为什么这些信息过去对开发人员有用?

2 个答案:

答案 0 :(得分:3)

将unsigned与signed 进行比较会出现严重问题,例如

std::string( "Bah" ).size() < -5

......永远都是真的。

这就是你收到警告的原因,但编制者在分配的时间框架内并不够聪明,看看任何特定的比较都是安全的。

现在提到你的要点问题。

  

在任何情况下始终使用无符号有符号整数是否有任何好处,性能或安全性?

是的,为了正确,避免UB。 但是,“适用”是你做位数事情的地方。对于数字,总是更喜欢有符号整数或浮点类型。

  

在什么情况下(如果有的话)比较有符号和无符号整数会导致错误或意外行为?

当涉及无符号环绕时,通常通过隐式提升操作数从signed到unsigned。

  

如果没有充分的理由担心这些警告,是否有任何历史原因,为什么这些信息过去对开发人员有用?

不适用。

答案 1 :(得分:0)

在您开始比较负数之前,这是安全的。

  

无符号整数可以保持正常int的两倍,但不能保持   负值。