C++中有符號/無符號數比較

原創文章,歡迎閱讀,禁止轉載。安全


 

在個人程序中有以下代碼編譯被警告了spa

if(list.size()>msize){...}
warning C4018: '<' : signed/unsigned mismatch
warning C4018: 「<」: 有符號/無符號不匹配   

這樣的比較是否是真可能出問題呢?看個例子code

int main()
{
    unsigned int a=0;
    int b = -10;
    cout<<(a>b)<<endl;        //應該是1,實際是0,有bug
    cout<<((int)a>b)<<endl;    //應該是1,實際也是1,正確
}

若是非要這麼比較,那麼何時結果是正確的呢?
答案是:當a,b的值都在signed/unsigned的重疊範圍內,即(UINT_MIN~INT_MAX)以內,稱之爲安全取值範圍。

詳細分析一下有符號/無符號數比較的問題,已32位程序爲例。
INT_MIN  0x80000000(補碼)
UINT_MIN 0x00000000
INT_MAX  0x7FFFFFFF
UINT_MAX 0xFFFFFFFFblog


 

解決方法:
消除警告的方法:
  強轉爲int而後比較,但仍有隱患。
防止錯誤的方法:
  1.都使用unsigned 類型。    
  2.或者評估實際運行中值的範圍,僅使用安全範圍內(UINT_MIN~INT_MAX)的值。io



附:關於計算機中整數表示的知識:
負數在計算機中是用補碼錶示的
反碼=原碼各位取反(符號位不動,0正1負)
補碼=反碼+1
abs(INT_MIN)=abs(INT_MAX)+1
INT_MIN=-(INT_MAX+1)=-INT_MAX-1 //去掉括號防止向上溢出編譯


原創文章,歡迎閱讀,禁止轉載。class

相關文章
相關標籤/搜索