Почему 08 не является допустимым целочисленным литералом в Java? - PullRequest
42 голосов
/ 28 августа 2011

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

Ответы [ 6 ]

65 голосов
/ 28 августа 2011

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

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

Например:

010 ==  8
024 == 20

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

14 голосов
/ 28 августа 2011

Любое число с префиксом 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 типов людей, которые понимают троичныйте, кто этого не делают, и те, кто считает это глупой шуткой.

4 голосов
/ 28 августа 2011

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

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

2 голосов
/ 08 июля 2017

В Java , если вы задаете целое число с начальным '0', это означает, что вы определяете число в Восьмеричное .

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

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

2 голосов
/ 28 августа 2011

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

1 голос
/ 03 марта 2017

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

...