原创文章,欢迎阅读,禁止转载。安全
在个人程序中有以下代码编译被警告了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