Что такое семантика 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.

Ответ 1

Вы назначили литерал символа, который делится одинарными кавычками, например 'a' (в отличие от строкового литерала, который делится двойными кавычками, например "a"), на переменную int. Java делает автоматическое расширение от 16-битного без знака char до 32-разрядной подписанной int.

Однако, когда символьный литерал является обратным слэшем, за которым следуют 1-3 цифры, это octal (base/radix 8) представление персонажа. Таким образом:

  • \15= 1 × 8 + 5 = 13 (возврат каретки, такой же, как '\r')
  • \25= 2 × 8 + 5 = 21 (NAK char - отрицательное подтверждение)
  • \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

Ответ 2

Обозначение \nnn обозначает восьмеричный код символа в Java. поэтому int a = '\15' присваивает значение с восьмеричным символом от 15 до a, которое является десятичным числом.

Ответ 3

Тот факт, что вы помещаете цифры в кавычки, заставляет меня подозревать, что он интерпретирует число как символьный литерал. Следующие цифры должны быть в восьмеричном формате.