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

Why are integer literals with leading zeroes interpreted strangely?

Почему целочисленные литералы с начальными нулями интерпретируются странно?

Выводится 83

System.out.println(0123)

Однако это выводит 123

System.out.println(123)

Почему это работает именно так?

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

Начальный ноль обозначает, что литерал выражен с помощью восьмеричного числа (число с основанием 8).

0123 можно преобразовать, выполнив команду (1 * 8 * 8) + (2 * 8) + (3), которая равна 83 в десятичной системе счисления. По какой-то причине восьмеричные числа с плавающей запятой недоступны.

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

Существует также префикс 0x, который обозначает, что литерал выражен в шестнадцатеричном формате (основание 16).

Ответ 2

Потому что целочисленные литералы, начинающиеся с 0, обрабатываются как восьмеричные числа.

Смотрите раздел 3.10.1 JLS

Ответ 3

Попробуйте это:

public static String leftPad(int n, int padding) {
return String.format("%0" + padding + "d", n);
}
leftPad(5, 3); // return "005"
leftPad(15, 5); // return "00015"
leftPad(224, 3); // return "224"
leftPad(0, 4); // return "0000"
Ответ 4

первый выводится как 83, потому что java принимает 0123 как восьмеричное число и выводит десятичный эквивалент этого числа.

java