官术网_书友最值得收藏!

2.1.6 字符類型

下面三種類型,char、signed char和unsigned char統稱為字符類型。編譯器可以自由地定義char,使它與signed char或unsigned char具有相同的范圍、表示方式和行為。不管編譯器作出的選擇是什么,char都是獨特的類型。

雖然沒有在任何地方指出,但C標準選擇字符類型遵從如下一致的理念。

signed char和unsigned char

·適用于小整數值

普通的char

·用于一個字符串字面值的每個元素的類型

·用于與整數的數據相對的字符數據(其中符號沒有意義)

下面的程序片段顯示了標準字符串處理函數strlen()分別被一個普通的字符串、一個有符號字符串和一個無符號字符串調用的情況。strlen()函數需要一個類型為const char*的參數。


1 size_t len;
2 char cstr[] = "char string";
3 signed char scstr[] = "signed char string";
4 unsigned char ucstr[] = "unsigned char string";
5
6 len = strlen(cstr);
7 len = strlen(scstr); /* warns when char is unsigned */
8 len = strlen(ucstr); /* warns when char is signed */

在符合“MSC00-C.在高警告級別沒有警告地編譯”的高警告級別進行編譯時,在下列情況下會發生警告。

·當char有符號時,由unsigned char[]轉換為const char *

·當char無符號時,由signed char[]轉換為const char *

要消除這些警告,強制類型轉換是必需的,但過多的強制類型轉換會使代碼很難閱讀并隱藏正常的警告消息。

如果用一個C++編譯器編譯這段代碼,由unsigned char[]轉換為const char與*由signed char[]轉換為const char *將被標記為需要強制類型轉換的錯誤。為了與標準的窄字符串處理函數兼容,“STR04-C.使用普通char類型表示基本字符集中的字符”建議,使用普通的char。

int

int類型用于下面這種情況,數據可能是EOF(一個負值)或解釋為unsigned char的字符,為防止出現符號擴展,于是把它轉換為int。例如,在一個用32位值表示int類型的平臺上,擴展ASCII碼0xFF會當作00 00 00 FF傳回。

·因此,fgetc()、getc()、getchar()、fgetwc()、getwc()和getwchar()都返回int。

·在中聲明的字符分類函數,如isalpha(),接受int參數,因為可能會傳給它們fgetc()或上述列表中其他函數的結果。

在C語言中,字符常量的類型為int。它的值是將普通的char轉換為int的結果。這造成的也許令人驚訝的后果是,對于所有的字符常量c,sizeof c等于sizeof int。這也意味著,例如,當x是一個char類型的變量時,sizeof'a'不等于sizeof x。

在C++語言中,與在C中的情況不同,僅包含一個字符的一個字符字面值,其類型為char,因此,它的大小是1。在C和C++中,一個寬字符字面值都具有wchar_t類型,而一個多字符字面值的類型都為int。

unsigned char

當正在操作的對象可能是任何類型,而且有必要訪問該對象的所有二進制位,比如用fwrite()時,unsigned char類型是有用的。不像其他的整數類型,unsigned char類型擁有獨特的屬性,即存儲在unsigned char類型對象中的值,保證會當作一個純粹的二進制表示法來表示屬性值。C標準定義的純粹二進制表示法為“一種使用二進制數字0和1的整數的位置表示法,其中,其值用連續二進制位乘以從1開始的2的連續整數次冪之和表示,除非此二進制位是最高位”。

unsigned char類型的對象都保證沒有填充位并因此沒有表示形式的陷阱。所以,任何類型的非二進制位域(non-bit-field)的對象都可以復制到一個unsigned char數組中(例如,通過memcpy()),并每次1個字節地檢查它們的表示形式。

wchar_t

·寬字符用于自然語言的字符數據。

“STR00-C.使用一個適當的類型來表示字符”建議字符類型的使用遵循這個相同的理念。對于基本的字符集中的字符,它用哪個數據類型并沒有關系,除非由于類型兼容的原因。

主站蜘蛛池模板: 饶阳县| 丽水市| 大埔县| 安顺市| 仁布县| 富民县| 晴隆县| 大庆市| 朔州市| 普安县| 武陟县| 湖州市| 黄大仙区| 芜湖县| 大同市| 内江市| 霞浦县| 东方市| 朔州市| 绩溪县| 安化县| 井陉县| 宿迁市| 常山县| 荥阳市| 黄冈市| 望城县| 西宁市| 穆棱市| 白山市| 庆云县| 威海市| 兖州市| 湘乡市| 阳新县| 玉环县| 延吉市| 斗六市| 垫江县| 南召县| 威海市|