- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 1260字
- 2020-10-30 17:56:38
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.使用一個適當的類型來表示字符”建議字符類型的使用遵循這個相同的理念。對于基本的字符集中的字符,它用哪個數據類型并沒有關系,除非由于類型兼容的原因。
- Data Visualization with D3 4.x Cookbook(Second Edition)
- 深度實踐OpenStack:基于Python的OpenStack組件開發
- 數據庫程序員面試筆試真題與解析
- INSTANT FreeMarker Starter
- Building a RESTful Web Service with Spring
- BeagleBone Media Center
- Processing互動編程藝術
- Building Minecraft Server Modifications
- Working with Odoo
- Kubernetes進階實戰
- 軟件體系結構
- 深入實踐DDD:以DSL驅動復雜軟件開發
- Learning Concurrency in Python
- Java并發實現原理:JDK源碼剖析
- SAS編程演義