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。)
總結:盡量不要在你的代碼中使用無符號類型,以免增加不必要的復雜性;或者使用時,在涉及混合運算時,進行強制類型轉換,這樣就不必由編譯器來選擇轉換類型了。