C語言signed和unsigned之間的程式設計陷阱

2021-08-05 21:46:28 字數 798 閱讀 7923

c語言中的整數可分為有符號整數(signed)和無符號整數(unsigned)。如果在程式中沒有特殊標識,整數型別預設為signed,這裡包括直接書寫的整數數字。定義unsigned類的整數時,可用unsigned作為字首,如果是直接書寫的數字,則在數字後加『u』,如2456326u。

signed類的整數和unsigned類的整數之間可以進行轉換,包括顯式轉換和隱式轉換。c語言對隱式轉換的規定是什麼呢?當帶符號數和無符號數之間進行操作的時候,要將帶符號數字轉換成無符號數字,再進行比較大小等各種操作。

下面舉乙個非常易錯的例程。

#include #define gap sizeof(int)

int main()

return 0;

}

另外,由於整數在機器中的表示問題,往往會使程式出現各種trick,很難找到問題出現的根源。對於帶符號數x,將其轉換為無符號數。如果x>=0,那麼轉換為無符號數沒有什麼特別的問題。但是若x<0,就會出現很嚴重的問題,因為系統是直接將x看做無符號數進行處理的。請看下面這個不等式。

-1>0u (√)

我們假設是16位整數。當進行比較的時候,-1先轉換為unsigned型別,然後兩者按照無符號數字進行比較。而數字-1的機器表示是11111111 11111111,該01串作為無符號數字的話會是16位整數中的最大值,顯然大於00000000 00000000!

我們看到,有符號數和無符號數混在一起時很容易出錯。正確的做法是,盡量避免使用無符號數,特別是不能僅僅因為變數的值始終大於0就去使用。當需要移位操作等情況下使用無符號數才是推薦的做法。

C語言之unsigned 與signed

c語言之unsigned 與signed 無符號與有符號資料的操作區別在於當最高位,當最高位為0時都一樣 當最高位為1時,進行資料型別間的轉換操作就會產生問題,詳情如下 在c中,預設的基礎資料型別均為signed,現在我們以char為例,說明 signed char與unsigned char之間的...

signed和unsigned的比較

昨天,zrf師兄丟給我這樣乙個題,據說是微軟面試題 unsigned int i 3 cout 問結果是多少。第一反應 3。不過結果似乎不是這樣的,寫了個程式,執行了一下,發現是 4294967293。很詭異的乙個數字,怎麼也想不明白為什麼會是這麼個奇怪的數字。但是在我發現這數的十六進製制數是fff...

signed和unsigned的比較

unsigned int i 3 cout 問結果是多少。第一反應 3。不過結果似乎不是這樣的,寫了個程式,執行了一下,發現是 4294967293。很詭異的乙個數字,怎麼也想不明白為什麼會是這麼個奇怪的數字。但是在我發現這數的十六進製制數是fffffffd時,我想我已經離答案很近了.這個涉及到了混...