2014-05-01 113 views
1

雖然這是一個非常初級的問題,但我覺得它很複雜。其實我想知道現場發生了什麼事?爲什麼Character.MAX_VALUE不打印字符的最大值(即65535)和MAX_VALUE-1。如何打印字符的最大值?

System.out.println("Byte Max Value: "+Byte.MAX_VALUE);//print 127 Ok! 
    System.out.println("Character Max Value: "+Character.MAX_VALUE);//print ?(Question Mark) 
    System.out.println(Character.MAX_VALUE-1);//print 65534 

回答

7

因爲在第二行中,Character.MAX_VALUE與字符串連接在一起。

作爲JLS狀態:

的字符串連接運算符+(§15.18.1),其中,由於一個 字符串操作數和一個整體的操作數時,將積分 操作數轉換成表示字符串它採用十進制形式 值,然後產生一個新創建的字符串是兩個 串

由於Character.MAX_VALUE是不可打印的串聯,你不看見。

在第三種情況下,您將使用int進行減法運算,因此整個表達式被轉換爲int,並且它打印出一個int值。

另外,作爲JLS狀態:當施加到兩個操作數的數字類型的 ,產生操作數的總和

二進制+運算執行加法。

[...]上的操作數執行

二元數值提升(§5.6.2)。

當操作者施加的二進制數值提升到一對操作數,其中的每一個必須表示一個值,該值可以轉換爲一個數字類型,適用下列規則,爲了:

  1. [.. ]

  2. 加寬原語轉換(§5.1.2)被施加到任何一個或 兩個操作數轉換由下面的規則中指定:

    如果操作數的類型是雙,其他被轉換加倍。

    否則,如果任一操作數的類型爲float,則另一個操作數將被轉換爲 以浮動。

    否則,如果其中一個操作數的類型爲long,則另一個操作數將被轉換爲長整型 。

    否則,兩個操作數都轉換爲類型int

如果你做

System.out.println("Character Max Value: "+(Character.MAX_VALUE+0)); 

這將打印Character Max Value: 65535

+0

:真正有用的.. :) –

0

隱式轉換。
您也可以明確地轉換爲int,以獲得MIN_VALUEMAX_VALUE有兩個println()方法....
System.out.println("char min. value: " + (int)Character.MIN_VALUE);
System.out.println("char max. value: " + (int)Character.MAX_VALUE);
在你你有第三行...
System.out.println(Character.MAX_VALUE-1);//print 65534
你基本上是隱式地將Unicode最大值轉換爲int,然後從該最大值中減去1。在Unicode格式中,範圍從U+0000U+FFFF,FFFF65535)是char基本數據類型的數字上限範圍,而00000)是char數據類型的數字下限範圍。在上面的兩個println()方法中,Character類是char原始數據類型的包裝類,它僅取原語char並將其包裝在Character類中。允許我們將它作爲一個對象,並讓我們訪問包裝類的字段和方法。
然後使用MIN_VALUEMAX_VALUE領域用點操作,我們可以投這些Unicode值來詮釋的,輸出是表示爲十進制數的範圍爲065535
當然可以理解,如果事情可以隱丟也可以被明確地施放。
我們也只在這裏考慮基礎多語言平面(平面0)。通常,通過編寫"U+"後跟四位十​​六進制數字來引用Unicode代碼點。因此這些平面0中的代碼點用四位十六進制數表示,沒有什麼困難。 Unicode代碼點不過是四位數的十六進制數字。飛機0的範圍爲65535可能表示的字符。維基百科在Unicode上有一篇很好的文章。

http://en.wikipedia.org/wiki/Unicode