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

一,問題的來源python

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

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

1: int i = 0;

這個i在通常的狀況下是沒有問題的,而後最近突發奇想,想像python那樣,可以支持負的下標。spa

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

 

二,問題的描述blog

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

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.get

這個是怎麼一回事呢。編譯器

 

三,問題的緣由博客

其實上一段程序編譯的時候會有一個常見的編譯器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也就是這個數。

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

相關文章
相關標籤/搜索