Какова семантика Java экранированного числа в символьном литерале, например '\15'?
Пожалуйста, объясните, что именно происходит при выполнении следующих разделов кода:
int a='\15';
System.out.println(a);
это печатает 13;
int a='\25';
System.out.println(a);
это печатает 21;
int a='\100';
System.out.println(a);
это печатает 64.
3 ответа
Вы присвоили символьный литерал, который разделен одинарными кавычками, например 'a'
(в отличие от строкового литерала, который ограничен двойными кавычками, например "a"
) для int
переменная. Java выполняет автоматическое расширение из 16-битных неподписанных char
на 32-битную подпись int
,
Однако, когда символьный литерал представляет собой обратную косую черту, за которой следуют 1-3 цифры, это восьмеричное ( основание / основание 8) представление символа. Таким образом:
\15
= 1 × 8 + 5 = 13 (возврат каретки; такой же, как'\r'
)\25
= 2 × 8 + 5 = 21 (символ NAK - отрицательное подтверждение)\100
= 1 × 64 + 0 × 8 + 0 = 64 (символ @; такой же, как'@'
)
Для получения дополнительной информации о символьных литералах и escape-последовательностях см. Разделы JLS:
Цитируя БНФ от 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
Запись \nnn
обозначает восьмеричный код символа в Java. так int a = '\15'
присваивает автоматически приведенное значение восьмеричного символа 15 a
который является десятичным 13.
Тот факт, что вы вводите цифры в кавычки, заставляет меня подозревать, что это интерпретация числа как символьного литерала. Цифры, которые следуют, должны быть в восьмеричном виде.