2015-03-25 12 views
6

Proszę wyjaśnić poniższy kodznaki drukarskie ósemkowe w Javie przy użyciu sekwencje

public class Example{ 
    public static void main(String[] args) 
    { 
     int i[]={9}; 
     System.out.println("\700"); 
    } 
} 

proszę nie mów mi, że wartość ósemkowa powinna być mniejsza niż 377. Znam go już, ale gdy uruchomię powyżej programu, otrzymuję dane wyjściowe jako . Chcę wiedzieć, dlaczego tak się dzieje?

Proszę podać jasne wyjaśnienie. Dziękujemy

+7

'" \ 700 "==" \ 70 "+" 0 "==" 8 "+" 0 "==" 80 "'. – Phylogenesis

+0

Thanq @ Phylogenesis –

Odpowiedz

7

Zasadniczo masz tam dwie postacie: '\70' i '0'.

sekwencja ucieczki dla octals jest documented in the JLS jak:

OctalEscape: 
\ OctalDigit 
\ OctalDigit OctalDigit 
\ ZeroToThree OctalDigit OctalDigit 

ostatni z nich nie ma zastosowania w przypadku, jako „7” nie jest w ZeroToThree, ale obie „7” i „0 "są cyframi ósemkowymi, więc pasuje do drugiego wzorca.

Teraz musimy tylko wiedzieć, dlaczego '\70' to "8" ... a to dlatego, że ósemkowy 70 ma dziesiętną 56 lub sześciokąt 38, czyli UTF-16 code unit for '8'.

+1

Tylko jeden mały nitpick, Jon, powiedziałbym, że jest mniej punktu kodowania UTF-16 niż punkt kodowy _Nicode_. UTF-16 to po prostu metoda kodowania punktów kodowych Unicode. – paxdiablo

+1

@paxdiablo: Miałem na myśli jednostkę kodową UTF-16, właściwie (ustaloną w odpowiedzi) - która jest bardziej odpowiednia niż kodowy kod Unicode, ponieważ 'char' jest jednostką kodową UTF-16. (W szczególności ciąg powinien być traktowany jako sekwencja jednostek kodowych UTF-16, pod względem rzeczy takich jak "charAt", "długość" itd. Może być mniej punktów kodowych niż jednostek kodu ...) –

Powiązane problemy