一,問題的來源python
在使用stl的時候,常常要遍歷容器。遍歷容器有幾種方法,一種就是使用下標遍歷。app
在使用下標遍歷的時候,常常要用到一個遍歷的循環變量,每每這個變量一順手就寫成了:ide
這個i在通常的狀況下是沒有問題的,而後最近突發奇想,想像python那樣,可以支持負的下標。spa
好比v是一個vector,v[-2]表示後兩個元素。code
二,問題的描述blog
假設有這麼一段簡單的程序:ip
-2跟2比較輸出的是 false,也就是-2要大於2.get
這個是怎麼一回事呢。編譯器
三,問題的緣由博客
其實上一段程序編譯的時候會有一個常見的編譯器warning:
「warning C4018: 「<」: 有符號/無符號不匹配」,一般warning咱們也不太在乎,可是指不定
何時,就耗掉你幾個小時。
這個waring就是說,在比較的時候,兩邊的符號不一致。
在式子:numIndex<numbers.size() 中
numIndex是有符號的,numbers.size()是無符號的。在有符號整數和無符號整數比較的時候,
有符號的整數會向無符號整數轉換,這個就是緣由。
四,問題的思考
那有符號的numIndex轉換成無符號的的整數究竟是多少呢?
其結果是
-2:4294967294
也就是說-2轉換成了4294967294,這個數固然比2要大。
那爲何是這個數呢?
由於C++中,int的大小是4個字節,也就是32位。2^32-2也就是這個數。
更多系列文章敬請訪問:個人我的博客 第九兔