-2比2小嗎? C++ 中 unsigned int 和 int的比較

一,問題的來源

在使用stl的時候,經常要遍歷容器。遍歷容器有幾種方法,一種就是使用下標遍歷。

在使用下標遍歷的時候,經常要用到一個遍歷的循環變量,往往這個變量一順手就寫成了:

1: int i = 0;

這個i在一般的情況下是沒有問題的,然後最近突發奇想,想像python那樣,能夠支持負的下標。

比如v是一個vector,v[-2]表示後兩個元素。

 

二,問題的描述

假設有這麼一段簡單的程序:

1: vector<int> numbers;//聲明一個vector; 2: numbers.push_back(1); 3: numbers.push_back(2);//壓入兩個數,讓他的size不爲0 4:  5: int numIndex =-2;//聲明一個有符號的整數 6: if(numIndex&lt;numbers.size()){//-2跟2比較 7: cout&lt;&lt;"true"&lt;&lt;endl; 8: }else{ 9: cout&lt;&lt;"false"&lt;&lt;endl; 10: }

-2跟2比較輸出的是 false,也就是-2要大於2.

這個是怎麼一回事呢。

 

三,問題的原因

其實上一段程序編譯的時候會有一個常見的編譯器warning:

“warning C4018: “&lt;”: 有符號/無符號不匹配”,通常warning我們也不太在意,但是指不定

什麼時候,就耗掉你幾個小時。

這個waring就是說,在比較的時候,兩邊的符號不一致。

在式子:numIndex&lt;numbers.size() 中

numIndex是有符號的,numbers.size()是無符號的。在有符號整數和無符號整數比較的時候,

有符號的整數會向無符號整數轉換,這個就是原因。

 

四,問題的思考

那有符號的numIndex轉換成無符號的的整數到底是多少呢?

1: unsigned int unumIndex = numIndex;//轉換 2: cout&lt;&lt;"unsigned value of -2:"&lt;&lt;unumIndex&lt;&lt;endl;

其結果是

-2:4294967294

也就是說-2轉換成了4294967294,這個數當然比2要大。

那爲什麼是這個數呢?

因爲C++中,int的大小是4個字節,也就是32位。2^32-2也就是這個數。

更多系列文章敬請訪問:我的個人博客 第九兔

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