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


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


 

在我的程序中有如下代碼編譯被警告了

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

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

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 0xFFFFFFFF


 

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



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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM