在C語言中,signed/unsigned用於修飾整數變量,signed表示有符號的,unsigned表示無符號的。 今天就帶大傢瞭解一下 關鍵字signed和unsigned 。
sign的本意是“標記,做記號”,ed後綴有一種完成時的感覺,這裡表示的是有符號的。
signed關鍵字是ISO/ANSI C90標準新增的,其常見於整數類型的符號規定處 。
其實說signed很常見也不見得,因為我們常用的int、short和long,以及long long,默認情況下都是signed有符號的
所以相比起來unsigned的戲份可能比signed更多,signed在這裡隻是相當於刻意地去說明其後面的變量是有符號類型的
-正數的補碼是其本身
-負數的補碼為負數的絕對值得各個位取反加1
舉個例子:
unsigned意為“沒有標記過的”,在C語言中表示無符號的,與關鍵字signed對應
這個關鍵字在很多頭文件的變量定義中還是很常見的,一般用在整數類型的符號說明處
unsigned的使用和signed類似,unsigned一般加在int等整數類型名稱前:
引入signed和unsigned的概念後,就要嚴格註意輸入輸出時候的格式瞭。
對於long和long long常量,能使用後綴直接給出unsigned的屬性:
-無符號數默認為正數n
-無符號數沒有符號位無符號數最小值為0,最大值為其所占的位數全為1時的值。
例如
C語言中變量默認 為有符號的類型,如要將變量聲明為無符號數,則需要使用unsigned關鍵字(C語言中隻有整數類型能夠聲明為unsigned無符號變量)。
輸出結果 :
6b6f4aa789b94604e760b78f62a5c9c4
總結:signed和unsigned用於修飾整數類型(包括char,從ANSI C89標準開始支持)。
signed是默認的 ,表示這個變量是有符號的, 也就是可以存儲整數和負數
unsigned則需要顯示給出,表示這個變量沒有符號值能存儲數的大小,而不能表示正負
signed存儲符號是有代價的,代價就是存儲空間中的一個比特位,專門用來存儲符號,這一位不能表示數值
所以 ,一般來說 ,同類型的signed能夠存儲的數的絕對值大小要小於unsigned
默認的int、short、long、long long為有符號數;換言之,int等價於signed int,short等價於signed short,long等價於signed long,long long等價於signed long long。
但是char本身是signed char還是unsigned char,取決於語言的實現(編譯器)。
數據類型范圍列表如下:
總之,signed和unsigned的區別基本就在於,是否把存儲的某一位看做符號位,unsigned時不看符號位,所以unsigned一般表示的是非負數
註意:
整數類型占多少字節空間是不確定的,隻能保證sizeof(short) <= sizeof(int) <= sizeof(long)。
在32位的設備平臺上,short為16位(2字節), int為32位(4字節),long為32位(4字節),long long為64位(8字節)。
在64位的設備平臺上,short為16位(2字節), int為32位(4字節),long為64位(8字節),long long為64位(8字節)。
看兩種情況:signed和unsigned分別存儲正數和負數,默認最高位為符號位
(1)正數6,分別用signed和unsigned方式在一個字節中存儲:0000 0110 [signed] 0000 0110 [unsigned]
(2)int類型的負數-5和正數4294967291在4個字節中的存儲:FFFF FFFB [十六進制]
上述例子有一個特點,就是不同變量在內存中的存儲形式是一樣的
由於0表示正,所以signed和unsigned的正數在內存中的表示是一樣的
而同樣的一個存儲,在signed和unsigned下就可能表示兩個不同的數(0除外)
所以unsigned類型的數一般要在輸入和輸出的時候刻意去註意。
50e457c899af17644f769d6567708444
如果你正在學習編程遇到瓶頸,感到迷茫,困惑,值得加入我的【C語言C++學習企鵝圈子】
學習交流,面試指導,簡歷修改...還有超多源碼素材等學習資料,零基礎的視頻等著你!
編程學習書籍:
e8092517b5ff724fbb7717fe200833dd
編程學習視頻:
下一篇