原創文章,歡迎閱讀,禁止轉載。
在我的程序中有如下代碼編譯被警告了
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 //去掉括號防止向上溢出
原創文章,歡迎閱讀,禁止轉載。
