位元組的概念是明確,但它的長度缺乏標準定義,具體的說明參加「位元組」。儘管在很多流行的系統中,乙個位元組的長度被視為8個位元,但是,這個並不是說乙個位元組就是8個位元。
不管是在基本源字符集,還是在基本執行字符集裡,從字元「0」開始,一直到「9」,他們的編碼值是依次遞增的,
這就是說,下面的**(他的功能是列印a~z的26個大寫英文本母)是不可移植的,因為c並未規定從字元a開始,一直到z,他們的編碼值必須連續遞增。當然,通常可以得到正確的結果,因為多數c實現都使用相容ascii的字符集。
#include
void f (
void
)
相反,下面的**(他的功能是列印從0到9這10個數字字元)是可移植的,因為標準已經對數字字元的連續性做了規定。
#include
void f (
void
)
正如已經講過的,轉換環境和執行環境並不總是相同的。因此,源字符集和執行字符集也可能不會恰好是同乙個。
-------顯而易見的是,c實現必須同時支援源字符集和執行字符集。他支援源字符集的原因是,在轉換為可執行程式之前,c的原始檔只是一堆字元。只有在「認得」這些字元的前提下,c實現才能做分析和轉換工作。
那麼c實現為什麼要支援執行字符集呢?考慮這樣乙個場景:很多c源程式會包含一些資訊文字,用於 執行時的加工與輸出。原始檔的多數內容在轉換之後就消失了,特別是在那些描述程式功能的部分,他們在轉換之後變成了機器指令,但程式中的資訊文字,諸如字元常量和字面串,都被保留,因為他們用於儲存、顯示、列印和傳輸。在這種情況下,c實現必須將這些源字符集中的字元轉換為執行字符集中的對應字元,即,將這些字元的編碼換成執行環境所使用的編碼。
-----不同的執行字符集(編碼方式)將影響到可執行程式映像中的字元編碼,先來看第乙個示例,我們採用utf-8作為執行字符集(編碼),這其實是gcc預設使用的字元編碼方案:
#include
int main (
void
)
如果按下面的方式轉換:
gcc exam.c -finput-charset=utf-
8-fexec-charset=utf-
8
------在程式轉換時,將字面串「abc中文「按照指定的編碼方案轉換為多位元組字元的序列,並用於初始化乙個不可見的靜態陣列。
------文例的輸出是10,因為」a「、」b「和」c「在utf-8編碼方案中都是8位,他們在當前的程式中共占用3個位元組;」中「和」文「的utf-8編碼都是3個8位,他們在當前程式中共佔6個位元組;最後還有乙個不可見的空字元,在當前程式中佔 1個位元組。
----相反用gbk轉換方式即有一些不同。
—原因」a「、」b「和」c「在gbk編碼方案中都是8位,他們在當前的程式中共占用3個位元組;」中「和」文「的gbk編碼都是2個8位,他們在當前程式中共佔4個位元組;最後還有乙個不可見的空字元,在當前程式中佔 1個位元組。
抄書(標準C語言指南)
c有完善的資料和控制流處理機制,但並不提供任何輸入 輸出手段。因此,為了實現這樣的目的,往往需要借助於機器語言 組合語言,或者呼叫為特定裝置而編寫的庫函式。如果程式是在宿主式環境下執行的,那麼,呼叫作業系統提供的例程 函式 往往是最方便的選擇,有時也是唯一的選擇。為了更好的演示如果呼叫作業系統的功能...
抄書(標準C語言指南)
空字元是基本字符集中的乙個 成員 字元,長度被定義為乙個位元組,他的所有位 位元 都是0.空字元用脫轉序列 0 表示。空字元放在字串的尾部,作為這個串的終止標記。作為乙個例項,下面的 用於統計字串的長度,但不包括尾部 的空字元 int s len const char s 空白字元 white sp...
抄書(標準C語言指南)
基本型別 basic types 包括無符號整型型別 有符合整數型別 浮點型別和char 型別 具體可參加各自的詞條。基本型別都是完整的物件型別,他們都具有已知的大小。對於每乙個有符號整數型別而言,他們都對應著乙個無符號整數型別。例如signed char 是有符號整數型別,他有乙個對應的無符號整數...