1. 程式人生 > >-1真的比1小嗎?

-1真的比1小嗎?

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