10

I am doing very simple int division and I am getting odd results.

This code prints 2 as expected:

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

This code prints 1 as not expected:

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

What is going on here?

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

Adam Goode
  • 7,380
  • 3
  • 29
  • 33
jjnguy
  • 136,852
  • 53
  • 295
  • 323

3 Answers3

22

The value 0200 is an octal (base 8) constant. It is equal to 128 (decimal).

From Section 3.10.1 of the Java Language Specification:

An octal numeral consists of an ASCII digit 0 followed by one or more of the ASCII digits 0 through 7 and can represent a positive, zero, or negative integer.

Greg Hewgill
  • 951,095
  • 183
  • 1,149
  • 1,285
6

The value 0200 is an octal, which is 128 in decimal.

For further information, see the literals section of the Primitive Data Types explanation.

moogs
  • 8,122
  • 8
  • 44
  • 60
1

Observed an interesting behavior here.

If I do an Integer.parseInt("0200"), I get 200 as o/p.

Howzzat ?!

jjnguy
  • 136,852
  • 53
  • 295
  • 323
divesh premdeep
  • 1,070
  • 3
  • 16
  • 28
  • 2
    Well check the API doc for parseInt. It says it all: public static int parseInt(String s) ... Parses the string argument as a signed decimal integer.The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign '-' ('\u002D') to indicate a negative value. – sateesh Nov 10 '09 at 06:25
  • 1
    parseInt parses a string with radix 10. A call to Integer.decode parses 0200 to 128. – Salandur Nov 10 '09 at 15:09