您的位置 首页 kreess

C語言丨關鍵字signed和unsigned 的使用與區別詳解

在C語言中,signed/unsigned用於修飾整數變量,signed表示有符號的,unsigned表示無符號的。 今天就帶大傢瞭解一下 關鍵字signed和unsign

在C語言中,signed/unsigned用於修飾整數變量,signed表示有符號的,unsigned表示無符號的。 今天就帶大傢瞭解一下 關鍵字signed和unsigned 。

1、signed

sign的本意是“標記,做記號”,ed後綴有一種完成時的感覺,這裡表示的是有符號的。

signed關鍵字是ISO/ANSI C90標準新增的,其常見於整數類型的符號規定處 。

signed的作用是:聲明有符號類型的整數類型。

其實說signed很常見也不見得,因為我們常用的int、short和long,以及long long,默認情況下都是signed有符號的

所以相比起來unsigned的戲份可能比signed更多,signed在這裡隻是相當於刻意地去說明其後面的變量是有符號類型的

有符號數在計算機中的的表示方法:在計算機內部,是用補碼表示有符號數

-正數的補碼是其本身

-負數的補碼為負數的絕對值得各個位取反加1

舉個例子:

2.unsigned

unsigned意為“沒有標記過的”,在C語言中表示無符號的,與關鍵字signed對應

這個關鍵字在很多頭文件的變量定義中還是很常見的,一般用在整數類型的符號說明處

unsigned的作用是:聲明無符號的整數類型。

unsigned的使用和signed類似,unsigned一般加在int等整數類型名稱前:

引入signed和unsigned的概念後,就要嚴格註意輸入輸出時候的格式瞭。

對於long和long long常量,能使用後綴直接給出unsigned的屬性:

無符號數在計算機中的表示方法:計算機用原碼表示無符號數

-無符號數默認為正數n

-無符號數沒有符號位無符號數最小值為0,最大值為其所占的位數全為1時的值。

例如

C語言中變量默認 為有符號的類型,如要將變量聲明為無符號數,則需要使用unsigned關鍵字(C語言中隻有整數類型能夠聲明為unsigned無符號變量)。

輸出結果 :

3、signed和unsigned的區別

總結: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字節)。

4、為什麼一定要區分signed和unsigned?

看兩種情況: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類型的數一般要在輸入和輸出的時候刻意去註意。

如果你正在學習編程遇到瓶頸,感到迷茫,困惑,值得加入我的【C語言C++學習企鵝圈子】

學習交流,面試指導,簡歷修改…還有超多源碼素材等學習資料,零基礎的視頻等著你!

編程學習書籍:

編程學習視頻:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部