C語言有符號整數隱式轉換無符號整數出現的陷阱

2021-06-21 13:45:57 字數 470 閱讀 9432

#include #include int main()

該程式意思是比較字串陣列s和字串陣列t的長度大小。按我們的理解,在第7行應該返回false,即輸出0。

c語言執行運算時,如果它的乙個運算數是無符號的,而另乙個是有符號的,那麼c語言會隱式的將有符號引數強制型別轉換為無符號數,並假設這兩個數都是非負的,來執行則會個運算。

再看這個程式,第7行輸出1的原因是由於函式size_t  strlen(const char *s) 的返回型別是size_t,檢視stdio.h可知size_t是無符號整形,當 s陣列長度比t陣列長度小1時,判斷式表示比較-1u>0。首先-1會轉換為無符號整形,即4294967295,顯然大於0。所以 這時候比較完之後返回為true,輸出為1。我們可以對 strlen(s)-strlen(t),進行強制轉換為一般整形數,再與0比較,就能避免了這種意想不到的錯誤。

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

今天在程式設計過程中遇到乙個有趣的問題,題目是根據類字典序對字串進行排序,其中有一段 如下 if s1.size s2.size 0 return true else return false 其中s1和s2分別是兩個string型別的字串。我用來測試的案例很簡單,是用 h 和 hl 這樣一組字串來...

C語言 有符號 無符號

include int main 注 資料儲存時將 0對應的區間值設定為最小值 2 7 1 說明 資料儲存在計算機中不存在符號位 無符號數最高位不是符號位,而就是數的一部分,無符號數不可能是負數。2 詳解當我們寫程式要處理乙個不可能出現負值的時候,一般用無符號數,這樣可以增大數的表達最大值。3 表範...

C語言有符號和無符號之間的轉換

無符號數 不存在正負之分,所有位都用來表示數的本身。有符號數 最高位用來表示數的正負,最高位為1則表示負數,最高位為0則表示正數。1 無符號數 有符號數 看無符號數的最高位是否為1,如果不為1 為0 則有符號數就直接等於無符號數 如果無符號數的最高位為1,則將無符號數取補碼,得到的數就是有符號數。2...