比较带符号整数和无符号整数安全吗? [英] Is comparing signed and unsigned integer safe?

查看:0
本文介绍了比较带符号整数和无符号整数安全吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在此代码示例中使用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;如果没有充分的理由担心这些警告,是否有历史原因,为什么这些信息在过去可能对开发人员有用?

不适用。

这篇关于比较带符号整数和无符号整数安全吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆