Почему 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

В Java, если вы определяете int с ведущим "0", означает, что вы определяете число в Октале.

int a = 08 выдаёт ошибку вне диапазона, потому что в Octal нет числа "8". Octal предоставляет только 0-7 номеров.

Если вы определяете a = 07, то он не выдаёт ошибку за пределами диапазона, потому что числа "0" и "7" находятся в пределах Октального диапазона.

Ответ 5

Ведущий нуль означает, что значение находится в восьмеричном. 8 не является восьмеричной цифрой, не более 2 действителен в двоичном формате или G имеет значение в шестнадцатеричном формате.

Ответ 6

В большинстве языков программирования, таких как Java и C/C++, число с начальным нулем интерпретируется как восьмеричное число. Как известно, восьмеричные числа представлены только в пределах от 0 до 7. Следовательно, числа, подобные 05, 03, 054, действительны, но числа, такие как 078, 0348, 09, 08, имеют тенденцию к недопустимости.