C++ 中的有符号/无符号不匹配错误

3
我遇到了编译代码的问题,以下是我的错误信息:
警告 C4018: '>=' : signed/unsigned mismatch
void Player::HasteCap()
{
    if (sWorld->getBoolConfig(CONFIG_PLAYER_HASTECAP_ENABLE))
        return;

    bool hasInstantHasteCap = (GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 0) == 1 
                            || GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1) == 1 
                            || GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 2) == 1 
                            || GetFloatValue(UNIT_MOD_CAST_SPEED) == 0);

    if (m_baseRatingValue[CR_HASTE_MELEE] > sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT))
    {
        SetFloatValue(UNIT_MOD_CAST_SPEED, 0);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + BASE_ATTACK, 1);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + OFF_ATTACK, 1);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + RANGED_ATTACK, 1);
    }

    else if (hasInstantHasteCap && m_baseRatingValue[CR_HASTE_MELEE] < sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT))
    {
        SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f);
        SetRegularAttackTime();
        ApplyCastTimePercentMod(m_baseRatingValue[CR_HASTE_SPELL] * GetRatingMultiplier(CR_HASTE_SPELL), true);

        if (GetShapeshiftForm())
        {
            SpellShapeshiftEntry const* ssEntry = sSpellShapeshiftStore.LookupEntry(GetShapeshiftForm());
            if (ssEntry && ssEntry->attackSpeed)
            {
                SetAttackTime(BASE_ATTACK, ssEntry->attackSpeed);
                SetAttackTime(OFF_ATTACK, ssEntry->attackSpeed);
                SetAttackTime(RANGED_ATTACK, BASE_ATTACK_TIME);
            }
        }
    }

    if (CanModifyStats())
    {
        UpdateDamagePhysical(BASE_ATTACK);
        UpdateDamagePhysical(OFF_ATTACK);
        UpdateDamagePhysical(RANGED_ATTACK);
    }
}

1
重复的问题 https://dev59.com/jm025IYBdhLWcg3w7qjL?rq=1? - Slava
抱歉,我正在学习C++并理解问题(未分配的int),但实际上无法弄清如何在这种情况下修复它。 - Madness
无符号整数并非未分配,你提问并不是问题,问题在于你没有检查它是否已经被回答过。 - Slava
3个回答

7

你比较的两个值应该具有相同的有符号/无符号属性,否则一个值将被强制转换为另一个值进行比较,这可能会导致意外的结果。

最好确保要比较的值是相同类型的,但是:

如果你知道哪个值可以安全地转换,那么明确地转换它。在你的情况下,将有符号值转换为无符号值。

例如:

unsigned int val1 = someunsignedvalue;  
int val2 = somesignedvalue;    
if (val1 > (unsigned int) val2) {
    /* do stuff */  
}

1
“safe” 的意思是 val2 大于等于 0。 - Alexey Frunze
谢谢,这非常有帮助。向之前已经发过此问题的所有人道歉,但我只是和其他人一样对整数的签名理解有困难。 - Madness
我认为你没有分享足够的代码让我们告诉你。请问以下代码的返回类型是什么:sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT)还有这段代码的类型是什么:m_baseRatingValue[CR_HASTE_MELEE] - john.pavan
这不是顺序,但这里大部分已列出:http://pastebin.com/n9w6MAyuCR_HASTE_MELEE是一个枚举类型,sWorld写入一个配置文件,在那里可以给定一个值来修改玩家的攻击速度。 - Madness
好的,我不认为你在pastebin上发布的内容实际上包含了我所要求的信息,因此我要猜测一下。我相信sWorld的getIntConfig函数返回一个int(带符号),而m_baseRatingValue是一种无符号类型。它们应该是相同的类型(查看它们的声明,这在你的帖子中我没有看到)。 - john.pavan
抱歉,这个系统太庞大了,很难找到所有的东西。我刚刚找到了它们,它们确实使用了不匹配的整数签名!我会更改它们并查看效果。非常感谢您的帮助。 - Madness

3

这些是警告而不是错误。通常情况下,代码应该能够编译通过即使有警告。但是,如果你指定了“将警告视为错误”的编译器选项,编译器会在出现任何警告(或错误)时停止编译。

为了解决这个警告,你可以将逻辑运算符的无符号一侧转换为int。


1
你发布的代码未包含相关成员/函数的定义,但编译器可能是正确的。你期望得到什么样的回答?要么解决问题(更改成员/函数/进行C样式转换/执行static_cast<...>等操作以使比较两侧的"signedness"匹配),要么使用适当的#pragma禁用此警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接