警告C4018:'<' :签名/未签名不匹配

时间:2014-03-05 08:48:41

标签: c++ visual-c++

在将项目从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;
}

谢谢! Ankush

3 个答案:

答案 0 :(得分:4)

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

long lDelFront = 0, lDelBack = 0;

size_t lDelFront = 0;
size_t lDelBack = 0;

避免签名/未签名比较

答案 1 :(得分:4)

这个问题没有提供足够的背景,特别是缺少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()函数的返回类型。

答案 2 :(得分:0)

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

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

要对这些进行比较,它可能会将i更改为无符号,这会给我们10 > 4294967295,这可能让您大吃一惊