C語言中的BYTE和char深入解析
例如,在下面的源程序中“""”之內(nèi)的“你”、“好”、“,”、“C”、“!”、“\n”就屬于程序要處理的字符。
#include <stdio.h>
int main(void)
{
printf("你好,C!\n");
return 0;
}
該源程序中的其他字符則屬于書寫源程序的字符,這其中也可能包含并沒有明顯顯示出來的字符,例如空格字符(space character)、水平制表符(horizontal tab)、垂直制表符(vertical tab)和換頁符(form feed)。
從某種意義上來說,編輯/編譯器是一種接受字符輸入,輸出可執(zhí)行文件的軟件,由它產(chǎn)生可執(zhí)行文件經(jīng)過加載成為內(nèi)存中的程序,這個(gè)程序通常也不可避免地要處理字符。
編輯/編譯器與它生產(chǎn)出的應(yīng)用程序并不一定運(yùn)行在同一個(gè)環(huán)境中,這就意味著兩者可能要各自處理不同的字符集合。
編輯/編譯器所要處理的字符就是書寫C語言源程序所用的字符,這種字符的集合叫源字符集(sourcecharacter set)。而應(yīng)用程序要處理的字符所構(gòu)成的集合叫執(zhí)行字符集(execution character set)。
對(duì)于多數(shù)C語言學(xué)習(xí)者來說,由于編輯/編譯環(huán)境與應(yīng)用程序運(yùn)行環(huán)境是重合的,可能意識(shí)不到源字符集與執(zhí)行字符集之間的區(qū)別。
•源字符集(source character set)
源字符集中的字符就是編寫C語言源程序的字符,也就是C語言要求編輯/編譯器所運(yùn)行的環(huán)境所提供的字符。這套字符由這幾部分組成:基本字符集(basic character set)、表示換行的字符(new-line character)和擴(kuò)展字符(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個(gè)。這就是C語言對(duì)編輯/編譯器運(yùn)行環(huán)境的最基本的要求,言外之意就是只要編輯/編譯器所運(yùn)行環(huán)境提供這95個(gè)字符就可以編寫C語言程序了。事實(shí)上C語言源程序也“主要”地由這95個(gè)字符組成。
此外,C語言還要求在編輯/編譯器運(yùn)行的環(huán)境中,0~9這十個(gè)字符的編號(hào)(編碼)必須是連續(xù)的。
遺憾的是,有些環(huán)境無法全部提供這95個(gè)字符。例如,據(jù)說有些國(guó)家的鍵盤上壓根就沒有“[”這個(gè)鍵。
由于存在這種情況,所以C語言也容許用所謂的三字符序列(trigraph)來表示那些環(huán)境不提供的字符。比如用“??<”表示“{”,用“??>”表示“}”。下面的代碼盡管看起來有些怪異,然而依然是合法的C程序。
#include<stdio.h>
int main(void)
??<
printf("你好,C!\n");
return 0;
??>
編譯器也可以對(duì)基本字符集自行進(jìn)行擴(kuò)展,這就是所謂的擴(kuò)展字符(extended characters)。前面代碼中的“你”、“好”就屬于擴(kuò)展字符。這些擴(kuò)展字符只能出現(xiàn)在標(biāo)識(shí)符、字符常量、字符串字面量、頭名(header name)、注釋以及某些預(yù)處理單詞(preprocessing token that is never converted to a token)中。代碼的其他其他部分出現(xiàn)擴(kuò)展字符則是一種未定義行為。
擴(kuò)展字符的值是由具體的編譯器定義的。源程序可以使用的所有字符的集合叫做擴(kuò)展字符集(extended character set)。
•執(zhí)行字符集
應(yīng)用程序運(yùn)行的環(huán)境中的字符集(the execution character set)也是一種擴(kuò)展字符集(extended character set)。
其中也必須包括前面提到的源字符集中的那95個(gè)基本字符集,0~9這十個(gè)字符的編碼也必須是連續(xù)的。
特別需要注意的是,C語言并沒有要求執(zhí)行環(huán)境中的基本字符集和編輯/編譯環(huán)境中的基本字符集具有相同的編碼方式,盡管這兩個(gè)基本字符集的“符”是相同的。
執(zhí)行環(huán)境中必須提供的字符還有alert,backspace,carriage return,new line以及一個(gè)各位都為0的字符(null character)。
執(zhí)行環(huán)境中程序可以處理的其他字符也被叫做擴(kuò)展字符(extended characters),這些擴(kuò)展字符與基本字符集以及alert,backspace,carriage return,new line和null character共同構(gòu)成了執(zhí)行環(huán)境中的擴(kuò)展字符集(extended character set),或稱之為執(zhí)行字符集(the execution character set)。
對(duì)于執(zhí)行環(huán)境來說,擴(kuò)展字符(extended characters)同樣是由編譯器自行定義的。
•C語言中的Byte
C語言中的Byte,如同int等類型類似,同樣不是一個(gè)確定長(zhǎng)度的位組。C語言只是要求Byte能放得下執(zhí)行環(huán)境中和編輯/編譯環(huán)境中基本字符集的編碼。這樣在某些編譯器中C語言中的Byte是9位就不難理解了,這并不違背C語言的基本定義。
同樣的道理,如果在編輯/編譯環(huán)境中,基本字符集的編碼是8位,而在運(yùn)行環(huán)境中基本字符集的編碼是16位的話,那么Byte的大小顯然就必須至少為16位。
由此可見,在C語境中的Byte并非是平時(shí)普遍認(rèn)為的octet(8位組)。
•C語言中的char數(shù)據(jù)類型
C語言中的char數(shù)據(jù)類型是一種整數(shù)類型(integer type),它的大小被定義為1個(gè)Byte。亦即
sizeof (char) ≡ 1
若需要知道某個(gè)具體編譯器的Byte究竟是多少位,可以查看編譯器提供的limits.h。其中定義的符號(hào)常量CHAR_BIT就是char類型的位數(shù),也就是Byte的位數(shù)。
補(bǔ)充:
C標(biāo)準(zhǔn)的矛盾?
"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.
相關(guān)文章
全面解析C++中的new,operator new與placement new
以下是C++中的new,operator new與placement new進(jìn)行了詳細(xì)的說明介紹,需要的朋友可以過來參考下2013-09-09C/C++靜態(tài)類和this指針詳解及實(shí)例代碼
這篇文章主要介紹了 C/C++靜態(tài)類和this指針詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02淺析c#中如何在form的webbrowser控件中獲得鼠標(biāo)坐標(biāo)
以下是對(duì)c#中如何在form的webbrowser控件中獲得鼠標(biāo)坐標(biāo)的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C語言結(jié)構(gòu)及隊(duì)列實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了C語言實(shí)現(xiàn)隊(duì)列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12C++深入刨析優(yōu)先級(jí)隊(duì)列priority_queue的使用
最近我學(xué)習(xí)了C++中的STL庫(kù)中的優(yōu)先級(jí)隊(duì)列(priority_queue)容器適配器,對(duì)于優(yōu)先級(jí)隊(duì)列,我們不僅要會(huì)使用常用的函數(shù)接口,我們還有明白這些接口在其底層是如何實(shí)現(xiàn)的2022-08-08