警告C4018:'> =' :VSC ++ 2010中的签名/未签名不匹配

时间:2015-03-13 15:10:20

标签: c++ visual-studio-2010

我正在学习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

2 个答案:

答案 0 :(得分:2)

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

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = -11;
    unsigned int b = 42;

    if ( a < b ) {
            printf("a<b\n");
    }
    else
    {
            printf("a>=b\n");
    }
}

打印出来:

a>=b

答案 1 :(得分:0)

警告意味着您要比较的变量的签名是不同的。

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

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

我假设m_dw*个变量是DWORD&#39; s,这意味着它们是32位无符号整数。

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

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

这样做也可以,但这取决于是否知道知道 TotalPlayMin总是一个正数。

编辑:请注意,由于我无法在代码中看到行号,因此我确实没有找到正确的行,并且还有很多&gt; =比较。< / p>