有符號和無符號整數的隱式轉換問題

2021-09-02 14:11:33 字數 773 閱讀 6939

今天在程式設計過程中遇到乙個有趣的問題,題目是根據類字典序對字串進行排序,其中有一段**如下:

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 後來發現乙個問題 送出來的資料都沒有負數,正常情況下是正負都有的,經過除錯發現了問題所在,現在把我的心 得...