Вопрос по long-integer, java, octal –  который также принимает начальную '#' как шестнадцатеричное число.

2

у такое поведение происходит?

long value = 123450;
System.out.println("value: " + value); 

значение: 123450

 

long value = 0123450;
//           ^
System.out.println("value: " + value); 

значение: 42792

Что это за 42792?

Ваш Ответ

5   ответов
3

3.10.1 для подробного, хотя и несколько сухого, описания числовых литералов Java. Чтобы найти и изучить более интересные вещи, как это, обратитесь к «Java-головоломкам»книга.

5

оно считается восьмеричным (основание 8). Однако println записывает это в базу 10.

123450 восьмеричное = 42792 десятичное.

5

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Если вы хотите напечатать что-то с нулями слева, вам нужно использоватьDecimalFormat метод форматирования.

http://download.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

В этом случае вы делаете это:

long value = 123450;
DecimalFormat df = new DecimalFormat("0");
System.out.println("value: " + df.format(value)); 
7

Почему такое поведение происходит?

Так же, как литералы, начинающиеся с0x обрабатываются как шестнадцатеричные числа (основание 16), литералы начинаются с0 рассматриваются каквосьмеричные числато есть числа в базе 8.

(Попробуйте написать 0789, и вы увидите, что компилятор будет жаловаться.)

Что это за 42792?

Число 123450 в базе 8 представляет собой число

1× 85 + 2× 84 + 3× 83 + 4× 82 + 5× 81 + 0× 80 = 42792

0

числа, ведущий «0x» для шестнадцатеричного числа. Было предложено, чтобы '0b' было двоичными числами для JDK 7.

Вы можете разобрать такой номер сInteger.decode(String) который также принимает начальную '#' как шестнадцатеричное число.

Похожие вопросы