class test{
public static void main(String args[]){
int a = 011;
System.out.println(a);
}
}
Выход
равен 9?
почему я получаю 9 как результат вместо 011. Может кто-то объяснить мне процесс, стоящий за этим. Почему я получаю 9? что это? Как я могу получить вывод как 011.
Спасибо!
Ответ 1
JLS 3.10.1 описывает четыре способа определения целых чисел.
Integer литерал может быть выражен в десятичной (база 10), шестнадцатеричной (базовая 16), восьмеричной (база 8) или двоичный (база 2).
Октальная цифра состоит из цифры 0, за которой следуют одна или несколько цифр от 0 до 7...
Десятичная цифра представляет собой либо цифру 0, представляющую целое число, либо состоящую из цифры от 1 до 9, а затем одну или несколько цифр от 0 до 9...
В заключение, если ваш целочисленный литерал (т.е. 011
) начинается с 0, тогда java примет его восьмеричную нотацию .
![пример восьмеричного преобразования]()
Решение:
Если вы хотите, чтобы ваше целое число удерживало значение 11, тогда не представляйте себе фантазию, просто назначьте 11. В конце концов, нотация ничего не изменит для значения. Я имею в виду, с математической точки зрения, 11 = 011 = 11,0.
int a = 11;
Форматирование имеет значение только при печати (или при преобразовании int
в String
).
String with3digits = String.format("%03d", a);
System.out.println(with3digits);
Форматирование "%03d"
используется для добавления ведущих нулей.
![formatter]()
В качестве альтернативы вы можете сделать это в 1 строке, используя метод printf
.
System.out.printf("%03d", a);
Ответ 2
Числовой литерал, начинающийся с 0, анализируется как восьмеричное число (т.е. основание 8). 011 равно 9 в восьмеричном.
Ответ 3
011
интерпретируется как восьмеричное число. Это означает, что он находится в базе 8. См. Также этот пост SO.. Из принятого ответа Стюарта Кука:
В Java и некоторых других языках целочисленный литерал, начинающийся с 0, интерпретируется как восьмеричная (базовая 8) величина.
Цифры в базе 10:
100s, 10s, 1s
Цифры в базе 8:
64s, 8s, 1s
Итак, 011
интерпретируется как 8 + 1 = 9