Почему 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
, имеют тенденцию к недопустимости.