2014-01-18 48 views
5

我學習Java通過「介紹了Java編程第9版」由丹尼爾·良在第9章「字符串」我遇到這段代碼:加減字符爲什麼這個工作? (JAVA)

public static int hexCharToDecimal(char ch){ 
     if (ch >= 'A' && ch <= 'F') 
      return 10 + ch - 'A'; 
     else 
      return ch - '0'; 
} 

OKI所以有人能解釋什麼剛剛發生在這裏?如何可以添加,從整數的子字符和它的背後是什麼意思,謝謝。

+0

http://stackoverflow.com/a/20720381/2792531 – nhgrif

+0

thx nhgrif,幫助我理解它 – thrax

回答

4

Old answer


專注於我的ASCII值的討論,即使我已經包括Unicode字符。

Docs

char數據類型是單16位的Unicode字符。'\u0000'和max:'\uffff'

  • ASCII value分鐘:0和max:65535(含)
  • - 分鐘

    • 其代碼點值(Unicode)的:

    炭可以表示

    請注意,0 == \u000065,535 == \uffff - 以及之間的一切。它們是相應的值。

    在你的代碼中,這些字符用ASCII值表示以進行算術運算(整數從0到65,535)。

    例如,炭'A'可以通過其INT(ASCII)值65表示:

    System.out.print('A'); // prints A 
    System.out.print((int)('A')) // prints 65 because you casted it to an int 
    

    作爲一個說明,一個short是一個16位簽署整數,所以即使char也是16位,char(65,535)的最大整數值超過short(32,767)的最大整數值。因此,從char轉換爲(short)並不總是可行。並且char的最小整數值是0,而short的最小整數值是-32,768。


    爲您的代碼,讓我們說,焦炭是'D'

    return 10 + ch - 'A'; 
    

    將返回10 + 68 - 65所以它會返回13

    對於所有意圖和目的,它 「轉換」 的char數據類型爲整數值,然後進行基本算術運算。該'D'炭可以通過68的整數ASCII值來表示

    比方說,焦炭是'H'

    if (ch >= 'A' && ch <= 'F') would not be true because `'H'` > `'F'` (72 > 70) 
    

    所以它會

    return ch - '0'; 
    

    這將返回72 - 48所以它會返回24

    +1

    感謝您的澄清 – thrax

    2

    個字符被依次存儲爲整數(ASCII值),這樣就可以對將返回一個char

    +0

    你能否詳細說明一下基於我坦白地給出了原因的例子我還是沒有得到它的邏輯 – thrax

    +1

    10 +'B' - 'A'= 11因爲B ASCII值是66和ASCII值是65 –

    2

    這是ASCII值的整數加法和子因爲焦炭是可被用作一個基本類型一個數值。字符串中的每個字符都被編碼爲一個特定的數字(在所有情況下都不是完全正確的,但對於對此問題的基本理解足夠了),Java允許您以這種方式使用字符。

    它可能允許這主要是出於歷史原因,這是它如何在C中的工作,他們可能會激發它與「性能」或類似的東西。

    如果你認爲這是奇怪的,那麼請不要擔心,我也這麼認爲

    對方回答不正確,其實。 ASCII是一種特定的編碼(編碼是一些規範,說「1 = A,2 = B,...,255 =空格」),這不是Java中使用的編碼。 Java字符是兩個字節寬,並通過unicode字符編碼進行解釋。不管如何Java的實際存儲的數據類型char

    1

    ,有什麼一定是這樣的,從字符'A'減去字符'A'將被表示爲null字符,\0。在內存中,這意味着每一位都是0。內存中佔用的內存大小可能因語言而異,但據我所知,null字符在所有語言中都是相同的,每一位都等於0

    作爲int值,一塊存儲器,每一個位等於0表示0

    的整數值,事實證明,當你「字符數學」,減去任何任何字母字符其他字母字符(同一個案例)會導致位被翻轉,如果您將它們解釋爲int,則表示這些字符之間的距離。此外,從其他數字字符中減去char '0'將導致從中扣除的字符的整數值,原因基本相同。

    'A' - 'A' = '\0' 
    'a' - 'a' = '\0' 
    '0' - '0' = '\0'