計算機程序的思惟邏輯 (8) - char的真正含義

本系列文章經補充和完善,已修訂整理成書《Java編程的邏輯》(馬俊昌著),由機械工業出版社華章分社出版,於2018年1月上市熱銷,讀者好評如潮!各大網店和書店有售,歡迎購買:京東自營連接 html

看似簡單的char

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

本節討論在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)就是先輸出高位字節,再輸出低位字節,這與整數的內存表示是一致的。post

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

因爲固定佔用兩個字節,char只能表示Unicode編號在65536之內的字符,而不能表示超出範圍的字符。編碼

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

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

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節到本節介紹了數據的二進制表示及位運算。

至此,咱們能夠定義基本數據類型,以及對基本數據進行基本運算了,但實際操做中不是隻有運算自己的,咱們須要有表達相似"若是"/"那麼"邏輯的機制,即根據具體狀況選擇執行的機制,也就是流程控制。


未完待續,查看最新文章,敬請關注微信公衆號「老馬說編程」(掃描下方二維碼),深刻淺出,老馬和你一塊兒探索Java編程及計算機技術的本質。原創文章,保留全部版權。

相關文章
相關標籤/搜索