彙編語言(二)——字符表示

如果計算機只存儲二進制數據,那麼它如何表示字符呢?計算機使用的是字符集,將字符映射爲整數。早期,字符集只用 8 位表示。即使是現在,在字符模式(如 MS-DOS)下運行時,IBM 兼容微機使用的還是 ASCII(讀爲“askey”)字符集。ASCII 是美國標準信息交換碼(AmeTican Standard Code for Information Interchange)的首字母縮寫。在 ASCII 中,每個字符都被分配了一個獨一無二的 7 位整數。由於 ASCII 只用字節中的低 7 位,因此最高位在不同計算機上被用於創建其專有字符集。比如,IBM 兼容微機就用數值 128〜255 來表示圖形符號和希臘字符。

美國國家標準協會(ANSI)定義了 8 位字符集來表示多達 256 個字符。前 128 個字符對應標準美國鍵盤上的字母和符號。後 128 個字符表示特殊字符,諸如國際字母表、重音符號、貨幣符號和分數。Microsoft Windows 早期版本使用 ANSI 字符集。

當前,計算機必須能表示計算機軟件中世界上各種各樣的語言。因此,Unicode 被創建出來,用於提供一種定義文字和符號的通用方法。Unicode 定義了數字代碼(稱爲代碼點(code point)),定義的對象爲文字、符號以及所有主要語言中使用的標點符號,包括歐洲字母文字、中東的從右到左書寫的文字和很多亞洲文字。代碼點轉換爲可顯示字符的格式有三種:

UTF-8 用於 HTML,與 ASCII 有相同的字節數值。

UTF-16 用於節約使用內存與高效訪問字符相互平衡的環境中。比如,Microsoft Windows 近期版本使用了 UTF-16,其中的每個字符都有一個 16 位的編碼。

UTF-32 用於不考慮空間,但需要固定寬度字符的環境中。每個字符都有一個 32 位的編碼。

有一個或多個字符的序列被稱爲字符串(string)。更具體地說,一個 ASCII 字符串是保存在內存中的,包含了 ASCII 代碼的連續字節。比如,字符串“ABC123”的數字代碼是 41h、42h、43h、31h、32h 和 33h。以空字節結束(null-terminated)的字符串是指,在字符串的結尾處有一個爲 0 的字節。C 和 C++ 語言使用的是以空字節結束的字符串,一些 Windows 操作系統函數也要求字符串使用這種格式。

下圖中列出了在 Windows 控制檯模式下運行時使用的 ASCII 碼。

ASCII碼錶

在查找字符的十六進制 ASCII 碼時,先沿着表格最上面一行,再找到包含要轉換字符的列即可。表格第二行是該十六進制數值的最高位;左起第二列是最低位。例如,要查找字母 a 的 ASCII 碼,先找到包含該字母的列,在這一列第二行中找到第一個十六進制數字 6。然後,找到包含 a 的行的左起第二列,其數字爲 1。因此,a 的 ASCII 碼是十六進制數 61。下圖用簡單的形式說明了這個過程:

 

0〜31 的字符代碼被稱爲 ASCII 控制字符。若程序用這些代碼編寫標準輸出(比如 C++ 中),控制字符就會執行預先定義的動作。下表列出了該範圍內最常用的字符。

用精確的術語描述內存中和顯示屏上的數字及字符是非常重要的。比如,在內存中用單字節保存十進制數 65,形式爲 0100 0001。調試程序可能會將該字節顯示爲“41”,這個數字的十六進制形式。如果這個字節複製到顯存中,則顯示屏上可能顯示字母“A”,因爲在 ASCII 碼中,0100 0001 代表的是字母 A。由於數字的解釋可以依賴於它的上下文,因此,下面爲每個數據表示類型分配一個特定的名稱,以便將來的討論更加清晰:二進制整數是指,以其原始格式保存在內存中的整數,以備用於計算。二進制整數保存形式爲 8 位的倍數(如 8、16、32 或 64)。
數字字符串是一串 ASCII 字符,例如“123”或“65”。這是一種簡單的數字表示法,下表以十進制數 65 爲例,列出了這種表示法能使用的各種形式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章