原創文章,歡迎閱讀,禁止轉載。安全
在個人程序中有以下代碼編譯被警告了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