-1真的比1小吗?

来源:互联网 发布:淘宝相片拍摄 编辑:程序博客网 时间:2024/04/28 00:41

-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;
}

原创粉丝点击