Hai assegnato un carattere letterale, che è delimitato da virgolette singole, ad esempio 'a'
(in quanto distinta da una stringa letterale, che è delimitato da virgolette, ad esempio "a"
) a una variabile int
. Java esegue un cast di ampliamento automatico da 16 bit senza firma char
a 32 bit con firma int
.
Tuttavia, quando un carattere letterale è una barra rovesciata seguita da 1-3 cifre, è una rappresentazione di octal (base/radix 8) del carattere. Così:
\15
= 1 × 8 + 5 = 13 (un ritorno al capo; stessa '\r'
)
\25
= 2 × 8 + 5 = 21 (char NAK - conferma negativa)
\100
= 1 × 64 + 0 × 8 + 0 = 64 (il simbolo @, uguale '@'
)
Per ulteriori informazioni sui valori letterali di carattere e le sequenze di escape, vedere le sezioni JLS:
Citando il BNF da 3.10.6:
OctalEscape:
\ OctalDigit
\ OctalDigit OctalDigit
\ ZeroToThree OctalDigit OctalDigit
OctalDigit: one of
0 1 2 3 4 5 6 7
ZeroToThree: one of
0 1 2 3
Sembra interpretare il numero come ottale. – Nikhil
'int a = '\ 15'' prima crea un' char' basato sul numero ottale "15" (decimale 13, come carattere, è l'ascii "Carriage Return"), che quindi si ricostituisce in un intero 'int' . Questo è legale dato che i caratteri sono interi a 16 bit, quindi è un upcast sicuro e nessuna informazione sul casting viene emessa da Java. Le altre risposte coprono già tutta la parte ottale/decimale. –
possibile duplicato di [Perché '\ 117' è un carattere letterale valido in Java?] (Http://stackoverflow.com/questions/14950593/why-is-117-a-valid-character-literal-in-java) – gparyani