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 帶來的一些問題
六、引用申明
在文章的過程中引用學習了好多其它網站的作品,現給連結
本文連結
對本文您可以隨意轉載,演繹,或者用於商業用途,但希望保留出處並且保證完整性,不要用不完整的東西誤導他人。