2009-11-10 10 views
10

Robię bardzo proste dzielenie int i otrzymuję dziwne wyniki.Podziałka Java int mylące

ten kod drukuje 2 zgodnie z oczekiwaniami: Drukuje

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

Ten kod 1 jak nie spodziewanych:

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

Co tu się dzieje?

(Windows XP Pro, Java 1.6 uruchomiony w Eclipse 3.4.1)

Odpowiedz

22

Wartość 0200 jest ósemkowy (podstawa 8) stała. Jest równa 128 (dziesiętnie).

Z Section 3.10.1 of the Java Language Specification:

ósemkową liczbowy składa się z cyfrą ASCII 0, a następnie przez jeden lub więcej znaków ASCII 0 do 7 oraz może stanowić korzystny zero lub dodatnią liczbę całkowitą.

+2

Wow, nie mogę uwierzyć, że nie wpadłem na to wcześniej. Czuję się jak idiota. Dzięki! – jjnguy

+2

Spojrzałem na twój wynik powtórzeń i chociaż to musi być coś innego! – moogs

+8

Jest to jedna z najbardziej irytujących cech języków opartych na języku C. Nigdy nie widziałem, żeby ktoś użył ósemkowej stałej celowo, ale widziałem, że powoduje ona wiele problemów. –

6

Wartość 0200 jest liczbą ósemkową, co oznacza w postaci dziesiętnej.

Aby uzyskać więcej informacji, zobacz sekcję literałów wyjaśnienia Primitive Data Types.

1

Zaobserwowano tutaj interesujące zachowanie.

Jeśli wykonam Integer.parseInt("0200"), otrzymam 200 jako o/p.

Howzzat?!

+2

Sprawdź dokumentację API dla parseInt. Mówi to wszystko: public static int parseInt (String s) ... Analizuje argument łańcuchowy jako liczbę całkowitą ze znakiem. Wszystkie znaki w łańcuchu muszą być cyframi dziesiętnymi, z tym wyjątkiem, że pierwszy znak może być ASCII minus "-" ("\ u002D"), aby wskazać wartość ujemną. – sateesh

+1

parseInt parsuje ciąg znaków z podstawą 10. Wywołanie funkcji Integer.decode przetwarza od 0200 do 128. – Salandur