[英]C++ Signed/unsigned mismatch
我無法正常編譯代碼。 這是我的錯誤:
警告C4018:'> =':有符號/無符號不匹配
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);
}
}
您要比較的兩個值的有符號/無符號性質應該相同,否則一個用於比較,另一個用於比較,這可能導致意外結果。
最好確保您所比較的是同一類型,但是:
如果您知道哪個值可以安全投射,則顯式轉換該值。 在您的情況下,將簽名值作為無符號值。
例如
unsigned int val1 = someunsignedvalue;
int val2 = somesignedvalue;
if (val1 > (unsigned int) val2) {
/* do stuff */
}
這些警告不是錯誤。 通常,盡管有警告,代碼仍應編譯。 但是,如果您指定“將警告視為錯誤”編譯器選項,則編譯器在生成任何警告(或錯誤)時將無法編譯。
要解決該警告,可以將邏輯運算符的一個無符號邊強制轉換為int。
您發布的代碼不包含相關成員/函數的定義,但編譯器可能是正確的。
你期望什么樣的答案?
要么解決問題(更改成員/函數/執行C樣式轉換/執行static_cast <...>等,以便比較雙方的“簽名”匹配),或者使用合適的#pragma禁用此警告
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.