Пожалуйста, объясните, что именно происходит, когда выполняются следующие разделы кода:
int a='\15';
System.out.println(a);
это распечатывает 13;
int a='\25';
System.out.println(a);
это распечатывает 21;
int a='\100';
System.out.println(a);
это распечатывает 64.
int a='\15'
сначала создаетchar
восьмеричное число «15» (десятичное 13, как char, это ascii «Возврат каретки»), которое затем преобразовывается вint
целое число. Это законно, поскольку символы представляют собой 16-битные целые числа, поэтому это безопасное преобразование, и Java не выдает никаких уведомлений о преобразовании. Другие ответы уже охватывают все восьмеричные / десятичные числа.Ответы:
Вы назначили символьный литерал, который разделен одинарными кавычками, например
'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:
Цитата BNF из 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
источник
1-3 digits
- так должно было быть0-3
. И это для трехзначного восьмеричного, двухзначного восьмеричного числа все еще может быть от0-7
. напр. '\ 77' по-прежнему действителен.Обозначение
\nnn
обозначает восьмеричный символьный код в Java. soint a = '\15'
назначает автоматически преобразованное значение восьмеричного символа 15,a
которому является десятичное 13.источник
\nnn
вовсе не означает восьмеричное число в Java. В коде OP он обозначает escape-последовательность восьмеричных символов. Окружающие кавычки важны. Затем символ расширяется до целочисленного значения с помощью присваивания. (Восьмеричные числа обозначаются ведущей нулевой цифрой.)Тот факт, что вы заключили цифры в кавычки, заставляет меня подозревать, что он интерпретирует число как символьный литерал. Последующие цифры должны быть восьмеричными.
источник