zoukankan      html  css  js  c++  java
  • 关于有符号数和无符号数比较的问题

    在无符号数和有符号数比较时,编译器会将有符号数转换为无符号数,一定要注意这一点,否则会非非非非非常坑!!!!

    比如说

     1 #include<iostream>
     2 using namespace std;
     3 int main(){
     4     int x=-1;
     5     unsigned int y=2;
     6     if(x>y)
     7         cout<<"yes";
     8     else
     9         cout<<"no";    
    10     return 0;
    11 }

    x是有符号的-1,y是无符号的2,正常人都知道-1小于2啊,所以运行这段代码后,一定会输出no啊,可是结果却是yes,为什么呢?因为无符号数和有符号数作比较的时候,编译系统会自动将有符号数转换为无符号数,这就是关键了,当有符号数-1和无符号数2比较的时候,系统会把有符号的-1转换为无符号数,-1转换有无符号数就是4294967295,这个数当然比2大,所以就输出yes了。

    上面说的这种情况是比较明显得,因为代码中出现了无符号数类型,可是有时候,这种错误及其不容易发现,比如:

     1 #include<iostream>
     2 using namespace std;
     3 int main(){
     4     int x=-1;
     5     string str="JOHN WALKER";
     6     if(x>str.size())
     7         cout<<"yes";
     8     else
     9         cout<<"no";    
    10     return 0;
    11 }

    这段代码中还是定义了一个值为1得有符号变量x,然后又定义了一个字符串,是用string类型定义的,然后判断x是不是大于字符串的长度,这个字符串长度为11,这谁都知道!所以x肯定小于11啊,但是代码的运行结果却是yes,纳尼?-1竟然大于11???

     一定是我的打开方式不对,可是尝试好几次之后,结果都一样,于是我就陷入了对人生的大思考之中……

    那么最后,我终于发现,这个c++自带的string类的size函数和length函数的返回值竟然是无符号数!那么这就可以说的通了,有符号数和无符号数比较的过程中,有符号数会转换为无符号数,-1转换为无符号数是4294967295,所以它就大于11了,所以就输出yes了。

    唉,没想到罪魁祸首竟然是因为size函数和length函数的返回值是无符号数,其实这个也可以理解,当初开发C++的前辈一定是认为字符串的长度一定不能是负数,所以将返回值设成无符号数,这样还能增大表示范围。

    所以以后再用size和length函数的时候,还是先用一个有符号变量来接收返回值吧,这样就不会有问题了。

    比如:

     1 #include<iostream>
     2 using namespace std;
     3 int main(){
     4     int x=-1;
     5     string str="JOHN WALKER";
     6     int len=str.size();
     7     if(x>len)
     8         cout<<"yes";
     9     else
    10         cout<<"no";    
    11     return 0;
    12 }

    这样,输出就一定是NO了。

  • 相关阅读:
    控件与布局
    高性能mysql笔记 第一章 mysql架构
    简单排序——冒泡,选择,插入
    spring boot的默认配置
    nginx配置 负载均衡
    nginx+tomcat反向代理
    fiddler(4)安装--L
    fiddler(3)http协议-响应报文--L
    fiddler(2)http协议-请求报文--L
    Fiddler(1)简介--L
  • 原文地址:https://www.cnblogs.com/fate-/p/12725543.html
Copyright © 2011-2022 走看看