官术网_书友最值得收藏!

5.1.2 字符型與整型的相互轉化

字符類型是一種新的變量類型,然而在編碼實踐的過程中,發現某個具體的字符值居然可以賦值給整型變量。就像下面的代碼一樣,把字符值賦給整型變量,編譯器不但沒報錯,而且還能正常運行(完整代碼見本章源碼的src\com\string\character\intToChar.java)。

    // 字符允許直接賦值給整型變量
    private static void charToInt() {
        int a='A';  // 把一個字符賦值給整型變量
        System.out.println("int a="+a);
        int tian='田';  // 把一個字符賦值給整型變量
        System.out.println("int tian="+tian);
    }

馬上運行上面的測試代碼,輸出日志如下:

int a=65
int tian=30000

之所以出現字符變成整數的情況,是因為計算機為了方便處理,將包括英文在內的拉丁字母都采用數字編碼,這樣字符才能保存在只認得二進制數的計算機系統中。因為計算機編程誕生在西方,所以早期的編程語言只支持英語和其他西歐語言。英文字母才26個,區分大小寫也才52個,加上標點符號等,最多128個,只用一字節來表達西方世界的字符已然綽綽有余(一字節為8位二進制數,可表達255個數值)。這套單字節的字符編碼標準源自美國,故而它被稱作ASCII碼(American Standard Code for Information Interchange,美國信息交換標準代碼)。

計算機編程傳播到其他國家時發現了問題,很多國家都有自己的語言文字,像常用的漢字就有3000多個,單字節的ASCII碼根本不夠用。于是后來又制定了DBCS(Double-Byte Character Set,雙字節字符集)標準,該標準使用兩字節來表示一個字符,這樣一共可以表示256×256-1=65535個字符,其中前128個字符與ASCII碼保持一致,剩余的位置留給了別的語言文字和擴展符號。其中,以漢字為主的東亞象形文字占據了從0x3000~0x9FFF之間的編碼,足足占去了DBCS所有字符的7/16。

既然字符值允許直接賦予整型變量,反過來整數(0~65535)也能直接賦予字符變量。譬如整數65賦值給字符變量就變成了字母A,整數30000賦值給字符變量就變成了漢字“田”。當然只有0~65535之間的整數才能正常給字符變量賦值,因為其他整數不在Java的字符型范圍之內。下面是將整數賦值給字符型變量的代碼例子:

    // 0~65535之間的整數允許直接賦值給字符變量。字符類型占兩字節
    private static void intToChar() {
        char a=65;  // 把一個數字賦值給字符變量
        System.out.println("char a="+a);
        char tian=30000;  // 把一個數字賦值給字符變量
        System.out.println("char tian="+tian);
        // 以漢字為主的東亞象形文字(中、日、韓)占據了從0x3000~0x9FFF之間的編碼
        char begin=0x3000;
        System.out.println("chinese begin="+begin);
        char end=0x9FFF;
        System.out.println("chinese end="+end);
        char max=65535;  // 字符型可表達的范圍是0~65535
        System.out.println("char max="+max);
    }

上面說到整型數與字符型之間允許直接相互賦值,也就是說可以把字符變量當作整型變量看待,這意味著字符變量也能參與加減乘除四則運算。不過一旦字符變量參與計算,由于編譯器不能確定計算結果是否還落在0~65535的整數區間,因此必須顯式地把運算結果強制轉換成字符char類型。以打印所有的大寫英文字母為例,只要指定了初始字符為A,那么便能對初始字符逐次加1,從而完成從A~Z之間所有字符的遍歷操作。具體的大寫字母遍歷代碼示例如下:

    // 字符變量允許跟整數直接加減乘除
    private static void printCapital() {
        char a='A';
        for (int i=0; i<26; i++) {  // 英語的大寫字母總共有26個
            // 因為不確定a+i之和是否超出0~65535的范圍,所以需要強制轉換成字符類型
            char capital=(char) (a+i);
            System.out.println("capital="+capital);
        }
    }
主站蜘蛛池模板: 汉沽区| 长海县| 丰台区| 东乌珠穆沁旗| 元朗区| 石台县| 吉首市| 门头沟区| 辽源市| 四平市| 睢宁县| 义乌市| 文成县| 石首市| 新丰县| 夹江县| 宣汉县| 福贡县| 林周县| 德州市| 利辛县| 河间市| 天水市| 集贤县| 井冈山市| 岳西县| 无锡市| 芜湖市| 南安市| 奉化市| 石林| 喜德县| 蚌埠市| 深泽县| 津市市| 张家川| 崇左市| 汽车| 武冈市| 南宫市| 建德市|