Вопрос-ответ

Why is 08 not a valid integer literal in Java?

Почему 08 не является допустимым целочисленным литералом в Java?

Почему 08 считается int вне диапазона, а 07 и ниже - нет?

Переведено автоматически
Ответ 1

В Java и нескольких других языках целочисленный литерал, начинающийся с 0, интерпретируется как восьмеричная величина (основание 8).

Для однозначных чисел (кроме 08 и 09, которые недопустимы) результат тот же, поэтому вы можете не заметить, что они интерпретируются как восьмеричные. Однако, если вы пишете числа с более чем одной значащей цифрой, результат может вас смутить.

Например:

010 ==  8
024 == 20

Поскольку восьмеричные литералы обычно не то, что вам нужно, вы всегда должны заботиться о том, чтобы никогда не начинать целочисленный литерал с 0, если, конечно, вы на самом деле не пытаетесь записать ноль сам по себе.

Ответ 2

Любое число с префиксом 0 считается восьмеричным. В восьмеричных числах могут использоваться только цифры 0-7, точно так же, как в десятичных - 0-9, а в двоичных - 0-1.

// octal to decimal
01 // 1
02 // 2
07 // 7
010 // 8
020 // 16

// octal to binary (excluding most significant bit)
01 // 1
02 // 10
07 // 111
010 // 1000
020 // 10000

Есть 10 типов людей: те, кто понимает троичный, те, кто нет, и те, кто думает, что это глупая шутка.


Ответ 3

Из спецификации Java:


Восьмеричная цифра состоит из цифры ASCII 0, за которой следует одна или несколько цифр ASCII от 0 до 7, и может представлять положительное, нулевое или отрицательное целое число.


Ответ 4

Начальный ноль означает, что значение в восьмеричном формате. 8 не является восьмеричной цифрой, в двоичном формате допустимо не более 2, а в шестнадцатеричном - G.

java