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

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

Другие вопросы по тегам