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