2009-11-10 3 views
10

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

Этот код гравюр 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)

ответ

22

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

От Section 3.10.1 of the Java Language Specification:

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

+2

Вау, я не могу поверить, что раньше не сталкивался с этим. Я чувствую себя идиотом. Благодаря! – jjnguy

+2

Я посмотрел на ваш репутационный счет, и я, хотя это должно быть что-то еще! – moogs

+8

Это одна из самых раздражающих особенностей языков на C. Я никогда не видел, чтобы кто-то использовал восьмеричную константу специально, но я видел, что это вызывало проблемы несколько раз. –

6

Значение 0200 представляет собой восьмеричное, который находится в десятичной системе .

Дополнительную информацию см. В разделе литералов в описании Primitive Data Types.

1

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

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

Howzzat?!

+2

Хорошо проверите API doc для parseInt. В нем сказано все: public static int parseInt (String s) ... Разбирает строковый аргумент в виде знакового десятичного целого. Символы в строке должны быть десятичными цифрами, за исключением того, что первый символ может быть ASCII минус знак '-' ('\ u002D'), чтобы указать отрицательное значение. – sateesh

+1

parseInt анализирует строку с помощью radix 10. Вызов Integer.decode разыгрывает 0200 - 128. – Salandur