Разделение Java int сбивает меня с толку

Я делаю очень простое деление на int и получаю странные результаты.

Этот код печатает 2, как и ожидалось:

public static void main(String[] args) {
    int i = 200;
    int hundNum = i / 100;
    System.out.println(hundNum);
}

Этот код выводит 1 как не ожидаемый:

public static void main(String[] args) {
    int i = 0200;
    int hundNum = i / 100;
    System.out.println(hundNum);
}

Что здесь происходит?

(Windows XP Pro, Java 1.6, работающая в Eclipse 3.4.1)


person jjnguy    schedule 10.11.2009    source источник


Ответы (3)


Значение 0200 - это восьмеричная (с основанием 8) константа. Он равен 128 (десятичный).

Из Раздел 3.10.1 Спецификации языка Java.:

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

person Greg Hewgill    schedule 10.11.2009
comment
Вау, не могу поверить, что не сталкивался с этим раньше. Я чувствую себя идиотом. Спасибо! - person jjnguy; 10.11.2009
comment
Я посмотрел на ваш счет повторений и подумал, что это должно быть что-то другое! - person moogs; 10.11.2009
comment
Это одна из самых раздражающих особенностей языков на основе Си. Я никогда не видел, чтобы кто-то специально использовал восьмеричную константу, но я видел, как это вызывает проблемы несколько раз. - person Mark Bessey; 10.11.2009
comment
Это случай бритвы Оккама. Обычно это самое простое решение. - person jjnguy; 10.11.2009
comment
Единственный раз, когда я специально использую восьмеричные константы, - это функция C mkdir(). - person Greg Hewgill; 10.11.2009

Значение 0200 - восьмеричное, то есть 128 в десятичном.

Для получения дополнительной информации см. Раздел литералов в примитивных типах данных объяснение.

person moogs    schedule 10.11.2009

Наблюдал интересное поведение здесь.

Если я сделаю Integer.parseInt("0200"), я получу 200 как o / p.

Какзат ?!

person divesh premdeep    schedule 10.11.2009
comment
Хорошо проверьте документацию API для parseInt. В нем все сказано: public static int parseInt (String s) ... Анализирует строковый аргумент как знаковое десятичное целое число. Все символы в строке должны быть десятичными цифрами, за исключением того, что первый символ может быть знаком минус ASCII '- '(' \ u002D ') для обозначения отрицательного значения. - person sateesh; 10.11.2009
comment
parseInt анализирует строку с основанием 10. Вызов Integer.decode анализирует 0200 до 128. - person Salandur; 10.11.2009