--來自百度
整型的每一種都分為:無符號(unsigned)和有符號(signed)兩種類型(float和double總是帶符號的),在除char以外的數據類型中,默認情況下聲明的整型變量都是有符號的類型;char在默認情況下總是無符號的。在除char以外的數據類型中,如果需聲明無符號類型的話就需要在類型前加上unsigned。無符號版本和有符號版本的區別就是無符號類型能保存2倍於有符號類型的正整數數據,比如16位系統中一個short能存儲的數據的范圍為-32768~32767,而unsigned能存儲的數據范圍則是0~65535。由於在計算機中,整數是以補碼形式存放的。根據最高位的不同,如果是1,有符號數的話就是負數;如果是無符號數,則都解釋為正數。另外,unsigned若省略后一個關鍵字,大多數編譯器都會認為是unsigned int。
C語言中的 unsigned int 和 signed int 類型的區別,最大的區別就是最高位是否用來做符號位。
但是char類型怎么可能還區分正字符和負字符呢?
C語言中並沒有專門用來表示字符的數據類型,char 像 int、short 類型一樣,也是一種整型,只不過,char 類型是最短的整型而已,所以它當然可以有 signed 和 unsigned 兩種類型。
的確,char 是 character 的縮寫,很多時候我們會把 char 類型當作是“字符類型”,但是在高度概括抽象的C語言中,字符也是整數,只不過它們遵循一些編碼而已,因此說 char 類型也是一種整型並不為過。
如果要說C語言中 char 類型與 short、int 等整數類型的區別,除了占用內存寬度不同,其他唯一的區別可能就在於:char 類型一般不等同於 signed char 型。
char 類型一般不等同於 signed char 型
也就是說,不指定 signed 或者 unsigned 的 char 類型,在C語言中是未定義的,若考慮不同的編譯器,我們不能確定 char 類型到底是有符號的,還是無符號的。而對於 short、int 類型,如果不明確指定 signed 或者 unsigned,一般默認其為有符號的。
稍稍總結一下,C語言中的 unsigned char 型的變量最高位也用於表示數值大小,而 signed char 類型變量的最高位則用於表示數值的符號 +/-,char 型變量是否有符號,則屬於未定義,在不同的編譯器上表現可能是不同的。
