-1真的比1小吗?
看到这篇博客的朋友,此时在想什么?不妨把现在所想写出来。
-1比1小,小学生都知道。但是在今天编程的时候,我发现了一个让我耗费了几个小时才搞清楚的事情。
事情是这样的。
class A,有一个unsigned int GetLength()方法,class B同样有一个unsigned int GetLength()方法。依据A、B创建a、b实例。
char * buff1和char * buff2,buff1-buff2=-1,也就是buff2指向的地址比buff1指向的地址高一个字节。
程序中,当(buff1-buff2) < (a.GetLength()+b.GetLength())时需要执行一些必要的操作。如:
if( (buff1-buff2) < (a.GetLength()+b.GetLength()) )
{
....
}
在程序运行过程中,打印buff1-buff2的值,为-1,(a.GetLength()+b.GetLength()) 的值为1,但是,无论如何也进入不了if的条件为true的代码段,即上面代码的“...”部分。
也许有经验的人,到此已经知道了问题所在,但是,我却经过了几个小时才搞清楚我究竟犯了什么错。
其实,问题很简单,GetLength方法返回的值是无符号整型,在比较大小时,编译器偷偷地为我们做了一件事,她把-1进行了类型提升为unsigned int类型,因此,-1编程了无符号整型中最大的值。从而,我们无论如何都得不到正确的结果。
数据类型的提升,说起来大家可能都很清楚,但有些时候这种隐蔽的类型转换,我们还真的要小心。
下面的代码,永远都会对你说:“-1不小于1”
#include <iostream>
int main(int argc,char * argv[])
{
if(-1<2u)
{
std::cout<<"-1确实小于1"<<std::endl;
}
else
{
std::cout<<"-1不小于1"<<std::endl;
}
return 0;
}