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

在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無符號變量)。

輸出結果 :

6b6f4aa789b94604e760b78f62a5c9c4

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

50e457c899af17644f769d6567708444

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

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

編程學習書籍:

e8092517b5ff724fbb7717fe200833dd

編程學習視頻:

发表回复

相关推荐

一月为什么是January?二月为什么是February?

英文的月份名称源自古罗马历法,有些按数字顺序排列,有些用神或皇帝命名。比如,“十月”October的拉丁语词根“octo”意思其实 ...

· 3秒前

詳解子平法中,木火交輝和金水相涵的詳細運用

在子平法中的經典之作《子平真詮》裡,有這麼一段記載:“春木逢火,則為木為通明,而夏木不作此論。秋金遇水,則為金水相涵,而冬...

· 4秒前

注意了!一天8杯水时间表

▌注意了!一天8杯水时间表 第1杯水:早上7点 清理肠胃经过一晚消耗,身体正处于缺水状态,一杯温开水有利于清理肠胃,这时也 ...

· 14秒前

河南大學22文學院中國語言文學考研經驗貼~

終於復試完啦,應該是可以被錄取啦淺淺說一下我的初試經驗!✅英語文學的英語分數線好高,一定要重視英語!!①背單詞單詞一定...

· 24秒前

披著文化狼皮的色情演繹---人體盛

日本有一種職業---女體盛,從事這種職業的需要非常苛刻的賽選,從事這種職業的人也稱“藝伎。女體盛藝伎要求苛刻首先,必須是c...

· 34秒前