关于有符号数和无符号数比较的问题

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

比如说

 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++的前辈一定是认为字符串的长度一定不能是负数,所以将返回值设成无符号数,这样还能增大表示范围。

扫描二维码关注公众号,回复: 10915497 查看本文章

所以以后再用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了。

猜你喜欢

转载自www.cnblogs.com/fate-/p/12725543.html