【问题标题】:Strange warning behavior with gcc and signed/unsigned comparisonsgcc 和有符号/无符号比较的奇怪警告行为
【发布时间】:2011-09-22 08:24:46
【问题描述】:

我有以下代码:

unsigned int a;
if (a > numeric_limits<int>::max())
   do_stuff();

编译时gcc报错

警告:“有符号和无符号的比较”

好的,我明白了

但是,使用以下代码:

unsigned int a;
if (a > (numeric_limits<int>::max()))
   do_stuff();

警告不再显示,我真的不知道为什么...... 这种行为有什么合乎逻辑的理由还是我做错了什么?!

【问题讨论】:

  • 尝试simulate this behavior。但它显示警告。
  • 周围的代码是什么?
  • @malamioute 创建一个 complete(= 编译),minimal 仍然表现出这种行为的示例(嗯,两个示例,一个带有警告,一个没有警告)并发布。由于我们无法重现您的问题,这表明问题实际上出在其他地方。
  • 我也可以在 gcc 4.6 上看到这种情况。也许是一个错误,也许引入了能够在没有演员表的情况下消除该警告?可能最好的办法是直接询问 gcc 人员。 (也可以在 4.5 和 4.7 上看到)
  • @KonradRudolph 我已经使用 iammilind 提供的最少代码(编译)测试了这种行为(参见link)。在这种情况下不会出现警告。我使用的gcc版本是4.6

标签: c++ comparison compiler-warnings


【解决方案1】:

这是因为它是一个错误。见bug 50012

【讨论】:

    【解决方案2】:

    我目前无法访问 C++ 编译器来测试这个,但我认为这可能会在没有任何警告的情况下工作:

    unsigned int a;
    if (a > numeric_limits<unsigned int>::max())
       do_stuff();
    

    【讨论】:

    • 这肯定会产生警告(语句总是错误的)!
    • 要在没有警告的情况下获得相同的结果需要if (a &gt; unsigned(numeric_limits&lt;int&gt;::max()))
    • 我现在也看到了。 a 不能大于0xffffffff,所以if (a &gt; unsigned(numeric_limits&lt;int&gt;::max())) 是正确的,正如@UncleBens 所指出的那样。
    【解决方案3】:

    答案在于 gcc 处理intunsigned int 的方式。

    unsigned intint 都存储一个 2 字节的值。它们之间的区别在于unsigned int 不支持负值。它只能存储 0-65,535 之间的值。 当 GCC 看到 int 和 unsigned int 之间的比较时,它会将 int 转换为正数。例如,如果 int 的值为 -2,它会将其转换为 2。但如果 int 前面有 () 运算符。 (整数)。 GCC 将其解释为正数(但仍将其转换)并且不给出警告。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2011-09-03
    • 2013-11-11
    • 2011-04-09
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多