當前位置:才華齋>計算機>C語言>

C語言中的BYTE和char字元

C語言 閱讀(1.72W)

C語言中,字元(character)這個術語具有兩個層次上的含義:書寫源程式的字元和程式處理的字元以下是小編為大家搜尋整理的C語言中的BYTE和char字元,希望能給大家帶來幫助!更多精彩內容請持續關注我們應屆畢業生考試網!

C語言中的BYTE和char字元

例如,在下面的源程式中“""”之內的“你”、“好”、“,”、“C”、“!”、“n”就屬於程式要處理的字元。

[cpp] view plaincopy

#include

int main(void)

{

printf("你好,C!n");

return 0;

}

該源程式中的其他字元則屬於書寫源程式的字元,這其中也可能包含並沒有明顯顯示出來的字元,例如空格字元(space character)、水平製表符(horizontal tab)、垂直製表符(vertical tab)和換頁符(form feed)。

從某種意義上來說,編輯/編譯器是一種接受字元輸入,輸出可執行檔案的軟體,由它產生可執行檔案經過載入成為記憶體中的程式,這個程式通常也不可避免地要處理字元。

編輯/編譯器與它生產出的應用程式並不一定執行在同一個環境中,這就意味著兩者可能要各自處理不同的字元集合。

編輯/編譯器所要處理的字元就是書寫C語言源程式所用的字元,這種字元的集合叫源字符集(sourcecharacter set)。而應用程式要處理的字元所構成的集合叫執行字符集(execution character set)。

對於多數C語言學習者來說,由於編輯/編譯環境與應用程式執行環境是重合的',可能意識不到源字符集與執行字符集之間的區別。

源字符集(source character set)

源字符集中的字元就是編寫C語言源程式的字元,也就是C語言要求編輯/編譯器所執行的環境所提供的字元。這套字元由這幾部分組成:基本字符集(basic character set)、表示換行的字元(new-line character)和擴充套件字元(extended characters)。

基本字符集(basic character set)包括:

A B C D E F G H I J K L M

N O P Q R S T U V W X Y Z

a b c d e f g h i j k l m

n o p q r s t u v w x y z

0 1 2 3 4 5 6 7 8 9

! " # % & ' ( ) * + , - . / :

; < = > ? [ ] ^ _ { | } ~

空格(space character)

控制符:horizontal tab, vertical tab, form feed

一共是95個。這就是C語言對編輯/編譯器執行環境的最基本的要求,言外之意就是隻要編輯/編譯器所執行環境提供這95個字元就可以編寫C語言程式了。事實上C語言源程式也“主要”地由這95個字元組成。

此外,C語言還要求在編輯/編譯器執行的環境中,0~9這十個字元的編號(編碼)必須是連續的。

遺憾的是,有些環境無法全部提供這95個字元。例如,據說有些國家的鍵盤上壓根就沒有“[”這個鍵。

由於存在這種情況,所以C語言也容許用所謂的三字元序列(trigraph)來表示那些環境不提供的字元。比如用“??<”表示“{”,用“??>”表示“}”。下面的程式碼儘管看起來有些怪異,然而依然是合法的C程式。

[cpp] view plaincopy

#include

int main(void)

??<

printf("你好,C!n");

return 0;

??>

編譯器也可以對基本字符集自行進行擴充套件,這就是所謂的擴充套件字元(extended characters)。前面程式碼中的“你”、“好”就屬於擴充套件字元。這些擴充套件字元只能出現在識別符號、字元常量、字串字面量、頭名(header name)、註釋以及某些預處理單詞(preprocessing token that is never converted to a token)中。程式碼的其他其他部分出現擴充套件字元則是一種未定義行為。

擴充套件字元的值是由具體的編譯器定義的。源程式可以使用的所有字元的集合叫做擴充套件字符集(extended character set)。

執行字符集

應用程式執行的環境中的字符集(the execution character set)也是一種擴充套件字符集(extended character set)。

其中也必須包括前面提到的源字符集中的那95個基本字符集,0~9這十個字元的編碼也必須是連續的。

特別需要注意的是,C語言並沒有要求執行環境中的基本字符集和編輯/編譯環境中的基本字符集具有相同的編碼方式,儘管這兩個基本字符集的“符”是相同的。

執行環境中必須提供的字元還有alert,backspace,carriage return,new line以及一個各位都為0的字元(null character)。

執行環境中程式可以處理的其他字元也被叫做擴充套件字元(extended characters),這些擴充套件字元與基本字符集以及alert,backspace,carriage return,new line和null character共同構成了執行環境中的擴充套件字符集(extended character set),或稱之為執行字符集(the execution character set)。

對於執行環境來說,擴充套件字元(extended characters)同樣是由編譯器自行定義的。

C語言中的Byte

C語言中的Byte,如同int等型別類似,同樣不是一個確定長度的位組。C語言只是要求Byte能放得下執行環境中和編輯/編譯環境中基本字符集的編碼。這樣在某些編譯器中C語言中的Byte是9位就不難理解了,這並不違背C語言的基本定義。

同樣的道理,如果在編輯/編譯環境中,基本字符集的編碼是8位,而在執行環境中基本字符集的編碼是16位的話,那麼Byte的大小顯然就必須至少為16位。

由此可見,在C語境中的Byte並非是平時普遍認為的octet(8位組)。

C語言中的char資料型別

C語言中的char資料型別是一種整數型別(integer type),它的大小被定義為1個Byte。亦即

sizeof (char) ≡ 1

若需要知道某個具體編譯器的Byte究竟是多少位,可以檢視編譯器提供的limits.h。其中定義的符號常量CHAR_BIT就是char型別的位數,也就是Byte的位數。

補充:

C標準的矛盾?

"addressable unit of data large enough to hold any member of the basic character set of the execution environment" (clause 3.6 of the C standard)

可是在5.2.1-3中

The representation of each member of the source and execution basic character sets shall fit in a byte.