2009-11-10 10 views
10

Sto facendo una divisione int molto semplice e sto ottenendo risultati strani.Java int division mi confonde

Questo stampa di codici a 2 come previsto: stampe

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

questo codice 1 come non previsto:

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

cosa sta succedendo qui?

(Windows XP Pro, Java 1.6 in esecuzione in Eclipse 3.4.1)

risposta

22

Il valore 0200 è un ottale (base 8) costante. È uguale a 128 (decimale).

Da Section 3.10.1 of the Java Language Specification:

Un numero ottale costituito da una cifra ASCII 0 seguita da una o più cifre ASCII 0 a 7 e può rappresentare un intero positivo, zero o negativo.

+2

Wow, non posso credere di non averlo incontrato prima. Mi sento un idiota. Grazie! – jjnguy

+2

Ho guardato il tuo punteggio rep e io penso che debba essere qualcos'altro! – moogs

+8

Questa è una delle caratteristiche più irritanti dei linguaggi basati su C. Non ho mai visto qualcuno usare una costante ottale di proposito, ma l'ho visto causare problemi più volte. –

6

Il valore 0200 è un ottale, che è in decimale.

Per ulteriori informazioni, consultare la sezione letterali della spiegazione Primitive Data Types.

1

Osservato un comportamento interessante qui.

Se faccio un Integer.parseInt("0200"), ottengo 200 come o/p.

Howzzat?!

+2

Controllare bene il documento API per parseInt. Dice tutto: public static int parseInt (String s) ... Analizza l'argomento stringa come un intero decimale con segno. I caratteri nella stringa devono essere tutti cifre decimali, tranne che il primo carattere può essere un ASCII segno meno '-' ('\ u002D') per indicare un valore negativo. – sateesh

+1

parseInt analizza una stringa con radix 10. Una chiamata a Integer.decode analizza da 0200 a 128. – Salandur