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

2.1.6 字符類(lèi)型

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

雖然沒(méi)有在任何地方指出,但C標(biāo)準(zhǔn)選擇字符類(lèi)型遵從如下一致的理念。

signed char和unsigned char

·適用于小整數(shù)值

普通的char

·用于一個(gè)字符串字面值的每個(gè)元素的類(lèi)型

·用于與整數(shù)的數(shù)據(jù)相對(duì)的字符數(shù)據(jù)(其中符號(hào)沒(méi)有意義)

下面的程序片段顯示了標(biāo)準(zhǔn)字符串處理函數(shù)strlen()分別被一個(gè)普通的字符串、一個(gè)有符號(hào)字符串和一個(gè)無(wú)符號(hào)字符串調(diào)用的情況。strlen()函數(shù)需要一個(gè)類(lèi)型為const char*的參數(shù)。


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.在高警告級(jí)別沒(méi)有警告地編譯”的高警告級(jí)別進(jìn)行編譯時(shí),在下列情況下會(huì)發(fā)生警告。

·當(dāng)char有符號(hào)時(shí),由unsigned char[]轉(zhuǎn)換為const char *

·當(dāng)char無(wú)符號(hào)時(shí),由signed char[]轉(zhuǎn)換為const char *

要消除這些警告,強(qiáng)制類(lèi)型轉(zhuǎn)換是必需的,但過(guò)多的強(qiáng)制類(lèi)型轉(zhuǎn)換會(huì)使代碼很難閱讀并隱藏正常的警告消息。

如果用一個(gè)C++編譯器編譯這段代碼,由unsigned char[]轉(zhuǎn)換為const char與*由signed char[]轉(zhuǎn)換為const char *將被標(biāo)記為需要強(qiáng)制類(lèi)型轉(zhuǎn)換的錯(cuò)誤。為了與標(biāo)準(zhǔn)的窄字符串處理函數(shù)兼容,“STR04-C.使用普通char類(lèi)型表示基本字符集中的字符”建議,使用普通的char。

int

int類(lèi)型用于下面這種情況,數(shù)據(jù)可能是EOF(一個(gè)負(fù)值)或解釋為unsigned char的字符,為防止出現(xiàn)符號(hào)擴(kuò)展,于是把它轉(zhuǎn)換為int。例如,在一個(gè)用32位值表示int類(lèi)型的平臺(tái)上,擴(kuò)展ASCII碼0xFF會(huì)當(dāng)作00 00 00 FF傳回。

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

·在中聲明的字符分類(lèi)函數(shù),如isalpha(),接受int參數(shù),因?yàn)榭赡軙?huì)傳給它們fgetc()或上述列表中其他函數(shù)的結(jié)果。

在C語(yǔ)言中,字符常量的類(lèi)型為int。它的值是將普通的char轉(zhuǎn)換為int的結(jié)果。這造成的也許令人驚訝的后果是,對(duì)于所有的字符常量c,sizeof c等于sizeof int。這也意味著,例如,當(dāng)x是一個(gè)char類(lèi)型的變量時(shí),sizeof'a'不等于sizeof x。

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

unsigned char

當(dāng)正在操作的對(duì)象可能是任何類(lèi)型,而且有必要訪問(wèn)該對(duì)象的所有二進(jìn)制位,比如用fwrite()時(shí),unsigned char類(lèi)型是有用的。不像其他的整數(shù)類(lèi)型,unsigned char類(lèi)型擁有獨(dú)特的屬性,即存儲(chǔ)在unsigned char類(lèi)型對(duì)象中的值,保證會(huì)當(dāng)作一個(gè)純粹的二進(jìn)制表示法來(lái)表示屬性值。C標(biāo)準(zhǔn)定義的純粹二進(jìn)制表示法為“一種使用二進(jìn)制數(shù)字0和1的整數(shù)的位置表示法,其中,其值用連續(xù)二進(jìn)制位乘以從1開(kāi)始的2的連續(xù)整數(shù)次冪之和表示,除非此二進(jìn)制位是最高位”。

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

wchar_t

·寬字符用于自然語(yǔ)言的字符數(shù)據(jù)。

“STR00-C.使用一個(gè)適當(dāng)?shù)念?lèi)型來(lái)表示字符”建議字符類(lèi)型的使用遵循這個(gè)相同的理念。對(duì)于基本的字符集中的字符,它用哪個(gè)數(shù)據(jù)類(lèi)型并沒(méi)有關(guān)系,除非由于類(lèi)型兼容的原因。

主站蜘蛛池模板: 汝南县| 比如县| 林口县| 榆社县| 连山| 甘谷县| 姚安县| 甘孜县| 彰武县| 铜山县| 莒南县| 徐水县| 河曲县| 亚东县| 武功县| 新乡县| 察隅县| 德钦县| 古田县| 临漳县| 长海县| 海门市| 夏邑县| 临洮县| 鄂托克前旗| 疏附县| 道真| 镇安县| 宜兰市| 东宁县| 桂林市| 青岛市| 法库县| 福泉市| 牟定县| 佛冈县| 恩平市| 海南省| 惠水县| 大埔县| 郸城县|