C語言無符號和有符號的區別


C語言定義一個int類型時,默認是有符號數,關鍵字signed常省略,如:
 
int a;
 
signed int a;
 
signed a;
 
這三句是一樣的定義
 
定義無符號數時,必須加關鍵字unsigned,如:
 
unsigned int a ;
 
unsigned a;
 
無符號關鍵字unsigned,只適用於int short long char四種變量,浮點型數據只有有符號類型。
 
那么為什么float會沒有無符號呢?C語言中,整型是采用二進制表示的,而浮點數卻是按照整數部分,小數部分,指數部分存放的。
 
運算也是分開來運算的。這樣的做法,使得浮點數可以表示很大的范圍,所以unsigned無法作用於float,定義無符號的浮點型會出錯。不夠的話,可以用double,雙精度。
 
以32位機為例,int 分為無符號 unsigned 和有符號 signed 兩種類型,默認為signed。二者的區別就是無符號類型能保存2倍於有符號類型的數據。
 
32位下,signed int 的表示范圍為:-2147483648 ~ 2147483647 (最高位做符號位)。
 
unsigned int 的表示范圍為:0 ~ 4294967295 (不保留符號位)。我們都知道,兩個不同的數據類型在進行混合使用時,會自動進行類型轉換。
 
其轉換原則就是:向着精度更高、長度更長的方向轉換。也就是我們平常見到的 char 轉為 int ,int 轉為 long,float 轉為 double  . etc. 
 
那么當涉及到unsigned 類型時,又會進行怎樣轉換呢?
 
ANSI C 標准采用值保留(value preserving)原則,就是當把幾個整型操作數混合使用時,其結果的類型可能是有符號數,也可能是無符號數,這取決於操作數的類型的相對大小。
 
(通俗點說,就是兩個整型數,如果都轉換為signed不會丟失信息,就轉換為signed;否則就轉換為unsigned。)
 
總結:盡量不要在你的代碼中使用無符號類型,以免增加不必要的復雜性;或者使用時,在涉及混合運算時,進行強制類型轉換,這樣就不必由編譯器來選擇轉換類型了。
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM