1. 程式人生 > >【轉載】計算機程序的思維邏輯 (8) - char的真正含義

【轉載】計算機程序的思維邏輯 (8) - char的真正含義

強制 blog 16進制 .com 做什麽 運算 字符常量 html 2種

看似簡單的char

通過前兩節,我們應該對字符和文本的編碼和亂碼有了一個清晰的認識,但前兩節都是與編程語言無關的,我們還是不知道怎麽在程序中處理字符和文本。

本節討論在Java中進行字符處理的基礎 - char,Java中還有Character, String, StringBuffer, StringBuilder等類進行文本處理,他們的基礎都是char,我們在後續文章中介紹這些類。

char看上去是很簡單的,正如我們在第2節所說,char用於表示一個字符,這個字符可以是中文字符,也可以是英文字符。賦值時把常量字符用單引號括起來,例如:

char c = ‘A‘;
char z = ‘中‘;

但我們在第3節拋出了一個問題,為什麽字符類型也可以進行算術運算和比較?char的本質到底是什麽呢?

char的本質

在 Java內部進行字符處理時,采用的都是Unicode,具體編碼格式是UTF-16BE。簡單回顧一下,UTF-16使用兩個或四個字節表示一個字 符,Unicode編號範圍在65536以內的占兩個字節,超出範圍的占四個字節,BE (Big Endian)就是先輸出高位字節,再輸出低位字節,這與整數的內存表示是一致的。

char本質上是一個固定占用兩個字節的無符號正整數,這個正整數對應於Unicode編號,用於表示那個Unicode編號對應的字符。

由於固定占用兩個字節,char只能表示Unicode編號在65536以內的字符,而不能表示超出範圍的字符。

那超出範圍的字符怎麽表示呢?使用兩個char。類String有一些相關的方法,後續文章介紹。

在這個認識的基礎上,我們再來看下char的一些行為,就比較容易理解了。

char的賦值

char有多種賦值方式:

  1. char c = ‘A‘
  2. char c = ‘馬‘
  3. char c = 39532
  4. char c = 0x9a6c
  5. char c = ‘\u9a6c‘

第1種賦值方式是最常見的,將一個能用Ascii碼表示的字符賦給一個字符變量。

第 2種也很常見,但這裏是個中文字符,需要註意的是,直接寫字符常量的時候應該註意文件的編碼,比如說,GBK編碼的代碼文件按UTF-8打開,字符會變成亂碼,賦值的時候是按當前的編碼解讀方式,將這個字符形式對應的Unicode編號值賦給變量,‘馬‘對應的Unicode編號是39532,所以第2種賦值和第3種是一樣的。

第3種是直接將十進制的常量賦給字符,第4種是將16進制常量賦給字符,第5種是按Unicode字符形式。

以上,2,3,4,5都是一樣的,本質都是將Unicode編號39532賦給了字符。

char的運算

由於char本質上是一個整數,所以可以進行整數可以進行的一些運算,在進行運算時會被看做int,但由於char占兩個字節,運算結果不能直接賦值給char類型,需要進行強制類型轉換,這和byte, short參與整數運算是類似的。

char類型的比較就是其Unicode編號的比較。

char 的加減運算就是按其Unicode編號進行運算,一般對字符做加減運算沒什麽意義,但Ascii碼字符是有意義的。比如大小寫轉換,大寫A-Z的編號是 65-90,小寫a-z的編號是97-122,正好相差32,所以大寫轉小寫只需加32,而小寫轉大寫只需減32。加減運算的另一個應用是加密和解密,將 字符進行某種可逆的數學運算可以做加解密。

char的位運算可以看做就是對應整數的位運算,只是它是無符號數,也就是說,有符號右移>>和無符號右移>>>的結果是一樣的。

char的二進制

既然char本質上是整數,查看char的二進制表示,同樣可以用Integer的方法,如下所示:

char c = ‘馬‘;
System.out.println(Integer.toBinaryString(c));

輸出為 1001101001101100

小結

本節介紹了char的本質,它固定占用兩個字節,實際上是一個整數,表示字符的Unicode編號,不在65536編號內的字符一個char表示不了,需要用兩個char。

我們回顧一下以前所有的章節,整理一下思路。

我們說,所謂程序,主要就是告訴計算機要對什麽數據做什麽操作。第1節我們介紹了如何通過變量定義數據,第2節介紹了數據的第一個操作 - 賦值,第3節介紹了數據的基本運算,第4節到本節介紹了數據的二進制表示及位運算。

至此,我們可以定義基本數據類型,以及對基本數據進行基本運算了,但實際操作中不是只有運算本身的,我們需要有表達類似"如果"/"那麽"邏輯的機制,即根據具體情況選擇執行的機制,也就是流程控制。

【轉載】計算機程序的思維邏輯 (8) - char的真正含義