今天在程式設計過程中遇到乙個有趣的問題,題目是根據類字典序對字串進行排序,其中有一段**如下:
if(s1.size()-s2.size()<=0)
return true;
else
return false;
其中s1和s2分別是兩個string型別的字串。
我用來測試的案例很簡單,是用「h」和「hl」這樣一組字串來比較,正確的輸出結果應該是h在前,hl在後,但是實際輸出卻總是hl在前,h在後,令我很是意外。自認為**設計的沒問題,但是經過一番除錯之後,結果仍舊不對,於是我靜下心來,終於想到問題是否出在我常用的size()上。
經過查詢size()函式定義,發現它返回的是乙個叫size_type型別的資料,於是繼續刨根問底,發現了typedef unsigned int size_t這句**,由此聯想到之前看的《深入理解計算機系統》中資料型別轉換中曾經出現過的隱式型別轉換:
有符號變數與無符號變數進行運算時,無符號變數會被隱式地轉換為有符號變數。
因此上面的if語句中,當s1.size()-s2.size()是乙個負數時,將它和0比較實際上在計算機內部是乙個非常大的整數和0比較,結果自然返回false。程式設計時需要特別注意資料型別的隱式轉換問題。
上面語句的修改方法有以下兩種:
if(s1.size()<=s2.size())
或
int m=s1.size()-s2.size();
if(m<=0)
C語言有符號整數隱式轉換無符號整數出現的陷阱
include include int main 該程式意思是比較字串陣列s和字串陣列t的長度大小。按我們的理解,在第7行應該返回false,即輸出0。c語言執行運算時,如果它的乙個運算數是無符號的,而另乙個是有符號的,那麼c語言會隱式的將有符號引數強制型別轉換為無符號數,並假設這兩個數都是非負的,...
C語言有符號和無符號之間的轉換
無符號數 不存在正負之分,所有位都用來表示數的本身。有符號數 最高位用來表示數的正負,最高位為1則表示負數,最高位為0則表示正數。1 無符號數 有符號數 看無符號數的最高位是否為1,如果不為1 為0 則有符號數就直接等於無符號數 如果無符號數的最高位為1,則將無符號數取補碼,得到的數就是有符號數。2...
有符號數和無符號數的轉換問題
最近做了乙個專案,需要高八位和低八位的資料顛倒一下,需要轉換的資料是有符號的16位資料,我編寫的函式如下 16bit資料高低位互換程式 int16 rearrange16 int16 data 後來發現乙個問題 送出來的資料都沒有負數,正常情況下是正負都有的,經過除錯發現了問題所在,現在把我的心 得...