1. 程式人生 > >char與signed char, unsigned char的區別

char與signed char, unsigned char的區別

一、開始

今天有一個困擾的問題,就是char與signed char, unsigned char這三者的區別。

二、三者之間

1.ANSI C 提供了3種字元型別,分別是char、signed char、unsigned char。而不是像short、int一樣只有兩種(int預設就是unsigned int).

2.三者都佔1個位元組

3.signed char取值範圍是 -128 到 127(有符號位) unsigned char 取值範圍是 0 到 255

4.記憶體中一串二進位制,它的含義,就是這個型別來說明的。

5.所謂signed char 和 unsigned char 其實是相對“運算”而說的,已經脫離了我們字面含義“字元”,表示的範圍有限。

三、char

1.char的定義

C標準中對char是 Impementation Defined,就是未明確定義

(1)那它由什麼定義?坦白說,具體的編譯器明確定義,一般都是用signed char或unsigned char來實現char的,也就是說不同的編譯器對char是什麼定義不一樣

(2)為什麼要這樣定義?因為這三種類型的物件在儲存介質中的表現形式是一樣的(都是一個佔8bit的01串,只是解析的時候不同)

(3)到底是signed char還是unsigned char?這得看編譯器:VC編譯器、x86上的GCC都把char定義為signed char,而arm-linux-gcc卻把char定義為 unsigned char

2.char的使用

char的不同使用給了它不同的字面上的含義

(1)當字元用

原始的ASCII標準裡,定義的字元碼值是隻有0~127,所以怎麼定義的char都剛好好裝得下,於是普通意義上我們對它的理解就是它表示一個字元,也就是讓表示一個ASCII碼(這也是C語言基礎中對它的解釋)

(2)當單位元組整數

從本質上來說,字元('a', 'b', 'c'等)本質上也是一個整數,只是字元代表的值是0~127,我們可以用char表示一個不太大的整數

四、關於高位擴充套件

說明:我們現在預設為VC的這一套 char 定義為 signed char

首先在記憶體中,char 與unsigned char沒有什麼不同,都是一個位元組,8個bit,普通的賦值,讀寫檔案和網路位元組流都沒什麼區別,反正就是一個位元組,不管最高位是什麼,最終的讀取結果都一樣,只是你怎麼理解最高位而已。

好吧,我們認為現在char的最高位為符號位,因此char能表示-128~127, unsigned char沒有符號位,因此能表示0~255。

但是螢幕上面的顯示可能不一樣。

五、舉例實踐:

#include <stdio.h>

void f(unsigned char v)

{

    char c = v;

    unsigned char uc = v;

    unsigned int a = c, b = uc;

    int i = c, j = uc;

    printf("----------------\n");

    printf("%%c: %c, %c\n", c, uc);

    printf("%%X: %X, %X\n", c, uc);

    printf("%%u: %u, %u\n", a, b);

    printf("%%d: %d, %d\n", i, j);

}

int main(int argc, char *argv[])

{

    f(0x80);

    f(0x7F); 

    return 0;

}
輸出:

%c: ?, ? %X: FFFFFF80, 80 %u: 4294967168, 128 %d: -128, 128 ---------------- %c: , %X: 7F, 7F %u: 127, 127 %d: 127, 127

----------------

所以,在程式設計中也要非常注意由於unsigned  帶來的一些問題

六、引用申明

在文章的過程中引用學習了好多其它網站的作品,現給連結

本文連結

對本文您可以隨意轉載,演繹,或者用於商業用途,但希望保留出處並且保證完整性,不要用不完整的東西誤導他人。