【问题标题】:warning C4018: '<' : signed/unsigned mismatch警告 C4018:“<”:有符号/无符号不匹配
【发布时间】:2014-03-05 08:48:40
【问题描述】:

在将项目从 vc++ 6.0 迁移到 vs 2008 时,我收到以下警告。谁能解释一下为什么会出现这个警告?

inline tstring& tstring::trim()
{
    long lDelFront = 0, lDelBack = 0;

    while (lDelFront < length() && at(lDelFront) == ' ')      //C4018 Warning
        lDelFront++;

    if ( lDelFront > 0 )
    {
        erase(0, lDelFront);
    }

    while (lDelBack < length() &&                       //C4018 Warning
            at(length() - lDelBack - 1) == ' ')
        lDelBack++;

    if ( lDelBack > 0 )
    {
        erase(length() - lDelBack, lDelBack);
    }

    return *this;
}

谢谢! 安库什

【问题讨论】:

  • 问题是 - 'lDelBack 已签名,length() 返回未签名或相反。或者你问这是什么问题?
  • 警告是因为 C++(和 C)有愚蠢的整数提升规则。 lDelFront 是有符号的,length() 是无符号的,这导致lDelFront 被转换为unsigned long,如果它有一个负值,那么它会突然变得非常大。
  • 请在发布到 SO 时正确缩进您的代码。此外,您应该在警告的一行中向我们提供所有变量的类型。

标签: c++ visual-c++


【解决方案1】:

length() 可能返回 size_t 或 unsigned long 并且您将它与有符号 long 进行比较。 改变

long lDelFront = 0, lDelBack = 0;

size_t lDelFront = 0;
size_t lDelBack = 0;

避免有符号/无符号比较

【讨论】:

  • 感谢 Bliaz Bratanic。这有帮助!
【解决方案2】:

该问题没有提供足够的上下文,特别是缺少length() 的原型。我们知道long 是一个有符号整数(参见here),从警告中我们可以猜测length() 返回一个无符号整数。

您不能只比较有符号和无符号整数并期望得到合理的结果。这是因为当您比较有符号或无符号数字时,符号位(“最左边”位)的解释不同。例如:

signed char c1 = 0x80;    // that's a -127 decimal
unsigned char c2 = 0x80;  // that's a 128 decimal

如果您对这些数字执行大于或小于比较并混合符号,则不清楚如何比较这些值,因为两者的结果不同。 (请注意,相等/不相等比较不会发生这种情况。)例如:

bool greater = c1 > 0;    // false, because 0x80 interpreted as signed number is negative
bool greater = c2 > 0;    // true, because 0x80 interpreted as unsigned number is positive

编译器会通过您遇到的警告告诉您此问题。有关此警告的更多详细信息是here

修复警告的正确解决方案是将long 更改为unsigned long,以匹配length() 函数的返回类型。

【讨论】:

  • 感谢您的回复并修复 Jens。
  • 不客气 :) 如果您发现其中一个答案有帮助,请接受一个!祝你好运...
【解决方案3】:

C++ 无法比较两种不同的类型,因此它将它们转换为相同的类型。将有符号转换为无符号会更改负数的值。

 unsigned u = 10;
 int i = -1;
 if (u > i)
     DoSomething();

为了比较这些,它可能会将i 更改为无符号,这给了我们10 &gt; 4294967295,这可能会让您感到惊讶

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多