警告 C4018:">=":VSC++ 2010 中的有符号/无符号不匹配

warning C4018: '>=' : signed/unsigned mismatch in VSC++ 2010

本文关键字:符号 无符号 不匹配 VSC++ C4018 gt 警告 2010      更新时间:2023-10-16

我正在学习C++但是当我想运行我的代码时遇到了一些问题......

int __cdecl Voter___Vote(Voter *_this, CPlayer *pOne, char *pdata){
CPlayer *pPlayer=(CPlayer *)pOne;
CPvpOrderView * Pvp=GetPvpOrderViewV(pPlayer);
char tmp1[255];
char tmp2[255];
char tmp3[255];
char tmp4[255];
itoa(pPlayer->m_Param.m_dbChar.m_byLevel,tmp1,10);
sprintf(tmp2, "%Lf", Pvp->m_dPvpPoint>=PvpPoint);
sprintf(tmp3, "%Lf", Pvp->m_dPvpPoint>=PvpCash);
itoa(pOne->m_pUserDB->m_AvatorData.dbAvator.m_dwTotalPlayMin>=TotalPlayMin,tmp4,10);
MessageBoxA(NULL,tmp2 ,tmp3,MB_OK); 
if(pPlayer->m_Param.m_dbChar.m_byLevel>=Lvl&&Pvp->m_dPvpPoint>=PvpPoint&&Pvp->m_dPvpCash>=PvpCash&&
    pOne->m_pUserDB->m_AvatorData.dbAvator.m_dwTotalPlayMin>=TotalPlayMin)
{return     p_Vote(_this,pOne,pdata);}
return 10;
}

我有一些这样的错误

Vote.cpp
Vote.cpp(42): warning C4018: '>=' : signed/unsigned mismatch
Vote.cpp(45): warning C4018: '>=' : signed/unsigned mismatch

比较有符号/无符号是危险的。非常直观地你会发现,小的有符号值比无符号值大:

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a = -11;
    unsigned int b = 42;
    if ( a < b ) {
            printf("a<bn");
    }
    else
    {
            printf("a>=bn");
    }
}

这将打印出来:

a>=b

警告表示您正在比较的变量的符号不同。

要解决此问题,您可以将无符号变量强制转换为有符号类型:

itoa(static_cast<signed>(pOne->m_pUserDB->m_AvatorData.dbAvator.m_dwTotalPlayMin)>=TotalPlayMin,tmp4,10);

我假设m_dw*变量是DWORD的,这意味着它们是 32 位无符号整数。

您还可以将有符号变量强制转换为无符号类型:

itoa(pOne->m_pUserDB->m_AvatorData.dbAvator.m_dwTotalPlayMin>=static_cast<unsigned>(TotalPlayMin),tmp4,10);

这也很好用,但这取决于您是否知道TotalPlayMin总是一个正数。

编辑:请注意,我实际上不确定我是否得到了正确的行,因为我在您的代码中看不到行号,并且那里也有很多>= 比较。