2015-03-13 21 views
0

我學習C++,但我有一些問題時,我想我的代碼運行...警告C4018:「> =」:簽訂VSC /無符號不匹配++ 2010

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 
+3

這些都是警告(不是錯誤) - 他們會告訴你,你是比較有符號和無符號值。這通常不是一個嚴重的問題,但無論如何,通過糾正基礎類型,或者通過使用合適的強制轉換來解決所有其他問題時,您應該修復它。 – 2015-03-13 15:13:46

+1

@PaulR這是很好的建議,但我個人認爲它確實是一個潛在的非常嚴重的問題。未定義的行爲只是一個需求。 – Bathsheba 2015-03-13 15:15:15

+0

@Bathsheba:不幸的是,這種有符號/無符號不匹配的情況非常普遍,除非將警告等級提高到「11」,否則大多數編譯器甚至不會生成警告。但我同意,有些情況下這種比較可能是致命的。 – 2015-03-13 15:18:35

回答

0

該警告意味着您正在比較的變量的符號性是不同的。

爲了解決這個問題,你可以在無符號變量轉換爲符號類型:

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將永遠是一個正數。

編輯:請注意,我並不確定我是否得到了正確的代碼,因爲我看不到代碼中的行號,並且在那裏也有很多> =比較。

+0

使用投射確實是最後的手段 - 它通常可以掩蓋問題而不是修復它 - 更好地解決潛在問題(通過糾正數據類型),而不僅僅是掩蓋問題並希望獲得最佳效果。 – 2015-03-13 17:32:21

2

比較有符號/無符號是危險的。相當對照直覺你會發現,小netgative簽署值比無符號的大:

#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 
相關問題