Печать восьмеричных символов в java с использованием escape-последовательностей

Поясните приведенный ниже код

public class Example{
   public static void main(String[] args)
   {
      int i[]={9};
       System.out.println("\700");
   }
}

Пожалуйста, не говорите мне, что восьмеричное значение должно быть меньше 377. Я уже знаю это, но когда я запускаю вышеуказанную программу, я получаю результат 80. Я хочу знать, почему так происходит?

Пожалуйста, дайте четкое объяснение. Спасибо


person prathapa reddy    schedule 25.03.2015    source источник
comment
Спасибо @ Филогенез   -  person prathapa reddy    schedule 25.03.2015


Ответы (1)


По сути, у вас есть два символа: '\70' и '0'.

Управляющая последовательность для восьмеричных чисел задокументирована в JLS как:

OctalEscape:
\ OctalDigit 
\ OctalDigit OctalDigit 
\ ZeroToThree OctalDigit OctalDigit 

Последнее из них не применимо в вашем случае, поскольку «7» не находится в ZeroToThree, но «7» и «0» являются восьмеричными цифрами, поэтому они соответствуют второму шаблону.

Итак, теперь нам просто нужно знать, почему '\70' равно "8"... и это потому, что восьмеричное 70 - это десятичное 56 или шестнадцатеричное 38, что является кодовая единица UTF-16 для '8'.

person Jon Skeet    schedule 25.03.2015
comment
Только один незначительный нюанс, Джон, я бы сказал, что это меньше кодовой точки UTF-16, чем кодовой точки Unicode. UTF-16 — это просто метод кодирования кодовых точек Unicode. - person paxdiablo; 25.03.2015
comment
@paxdiablo: на самом деле я имел в виду кодовую единицу UTF-16 (исправлено в ответе), что более актуально, чем кодовая точка Unicode, поскольку char является кодовой единицей UTF-16. (В частности, строку следует рассматривать как последовательность кодовых единиц UTF-16 с точки зрения таких вещей, как charAt, length и т. д. Кодовых точек может быть меньше, чем кодовых единиц...) - person Jon Skeet; 25.03.2015