無符號整型與有符號整型的比較

喵哥最近遇到一個問題,比較兩個數的時候經常會出現很嚴重的bug,比如:

unsigned int a = 0;
int b = -2;
if (a < b)
	b = 1;
cout << b << endl;

乍一看這段代碼輸出的應該是-2,0肯定不會小於-2嘛,但是事實上,“b = 1;”這行代碼是會被執行的。如果大家對算術轉換比較熟悉的話,應該會想到這應該是發生了“整型提升”——int提升爲unsigned int。其實大家感到困惑的一個重要原因是:書本給的例子大多數都是加減乘除時整型提升,讓人很慣性地認爲只有進行算術運算的時候纔會發生轉換。事實上,這些類型的轉變發生在所有雙目運算符執行的時候(雙目運算符的兩個運算對象類型不一樣)。那麼自然而然地,在“<”等這類運算符執行時會對運算對象進行類型轉換。

爲了直觀地表示這種轉換,喵哥把代碼的彙編貼出來:

在彙編中,b的值臨時放在eax中,在執行到(a<b)的時候,b的值(即eax)變爲了4294967294(unsigned int),這個數顯然是大於0的,故而條件爲真,執行b = 1;。

如果把a的值改爲4294967295,即unsigned int的最大值,則條件會爲false。

再如:

string str = "hello";
int pos = str.find('a');
string::size_type n = string::npos;
if (pos == n)
	cout << "no";

string::npos的值是unsigned long long的最大值18446744073709551615,即long long的-1,在比較pos與n時,pos的類型會自動提升爲unsigned long long。

通常,認爲string::npos等於-1就好了。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章