zoukankan      html  css  js  c++  java
  • 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 //去掉括号防止向上溢出


    原创文章,欢迎阅读,禁止转载。

  • 相关阅读:
    索引查找Java实现
    经典算法之折半查找
    进制转换问题
    排序算法总结之希尔排序
    自己写的栈
    排序问题Java
    画柱状图Java
    一些值得看的性能优化的文章
    理解 BFC
    canvas
  • 原文地址:https://www.cnblogs.com/zhaojk2010/p/5984457.html
Copyright © 2011-2022 走看看