在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在這裡只是相當於刻意地去說明其後面的變數是有符號型別的

signed int a; /* 通常這裡帶signed的變數定義都可以省略掉signed,因為signed本身就是預設的 */

signed short int b;

signed short c;

signed long int d;

signed long e;

signed long long f;

unsigned int g; /* 寫上signed後,上面的定義似乎在刻意地大聲說“上面這些變數應該是有符號的” */

unsigned short h; /* 但一般unsigned的戲份還是比signed多,signed關鍵字和auto關鍵字的宿命類似 */

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

-正數的補碼是其本身

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

舉個例子:

8位整數 5的補碼為:0000 0101

8位整數 -7的補碼為:取絕對值|-7| = 7 ——>

二進位制

為 0000 0111 ——> 各個位取反 1111 1000 ——>最後加1 ——>1111 1001,所 以-7在計算機中就表示為1111 1001。

16位整數

20的補碼為:0000 0000 0001 0100

16位整數 -13的補碼為:1111 1111 1111 0011(可自行推導)

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

2.unsigned

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

這個關鍵字在很多標頭檔案的變數定義中還是很常見的,一般用在整數型別的符號說明處

unsigned的作用是:宣告無符號的整數型別。

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

/* unsigned可以修飾的幾種型別 */

unsigned int a; /* 無符號整型 */

unsigned short b; /* 無符號短整型 */

unsigned long c; /* 無符號長整型 */

unsigned long long d; /* 無符號long long型別 */

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

printf(“%d, %u”, a, b); /* %u是unsigned型別的說明符 */

printf(“%u, %d”, a, b); /* 如果對signed型別的變數用%u,那就不會去找記憶體中的符號位,全部當數字位處理 */

/* 這時顯示的結果可能與signed本身想表達的值差異很大,數字0情況除外 */

unsigned short c = 4;

printf(“%hu”); /* %h是短整型,%hu表示無符號短整型 */

unsigned long d = 5;

printf(“%lu”); /* %l是長整型,%lu表示無符號長整型 */

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

120L; /* L字尾表示

long常量

*/

120LU; /* 再加上U字尾表示unsigned */

120LLU; /* LLU表示unsigned long long */

120ull; /* ull這樣寫也對 */

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

-無符號數預設為正數n

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

例如

8位無符號整數,最小值為0,最大值為二進位制1111 1111,轉換為

十進位制

就是255。

對於固定長度的無符號數,

MAX_VALUE + 1 = MIN_VALUE

MIN_VALUE - 1 = MAX_VALUE

C語言中變數預設 為有符號的型別,如要將變數宣告為無符號數,則需要使用unsigned關鍵字(C語言中只有整數型別能夠宣告為unsigned無符號變數)。

#include

int main()

{

int i; //預設i為有符號數

signed int j; //顯示宣告j為有符號數

unsigned char min_value = 0; //顯示宣告k為無符號數

unsigned char max_value = 255;

unsigned char sub_result = min_value - 1; //無符號數最小值 - 1 = 最大值

unsigned char add_result = max_value + 1; //無符號數最大值 + 1 = 最小值

printf( “%d\n”, sub_result ); //分析輸出 255

printf( “%d\n”, add_result ); //分析輸出 0

return 0;

}

輸出結果 :

255

0

C語言丨關鍵字signed和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

,取決於語言的實現(編譯器)。

資料類型範圍列表如下:

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

總之,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型別的數一般要在輸入和輸出的時候刻意去注意。

文章參考來源:

https://

blog。csdn。net/wen381951

203/article/details/79922220

https://

blog。csdn。net/Johan_Joe

_King/article/details/84201039

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

如果你正在學習程式設計遇到瓶頸,感到迷茫,困惑,值得加入我的【

C語言C++學習企鵝圈子

學習交流,面試指導,簡歷修改。。。還有超多原始碼素材等學習資料,零基礎的影片等著你!

程式設計學習書籍:

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

程式設計學習影片:

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