Why is 08 not a valid integer literal in Java?
Why is 08
considered an out of range int but 07
and below are not?
Solution 1:
In Java and several other languages, an integer literal beginning with 0
is interpreted as an octal (base 8) quantity.
For single-digit numbers (other than 08
and 09
, which are not allowed), the result is the same, so you might not notice that they are being interpreted as octal. However, if you write numbers with more than one significant digit you might be confused by the result.
For example:
010 == 8
024 == 20
Since octal literals are usually not what you want, you should always take care to never begin an integer literal with 0
, unless of course you are actually trying to write zero by itself.
Solution 2:
Any number prefixed with a 0 is considered octal. Octal numbers can only use digits 0-7, just like decimal can use 0-9, and binary can use 0-1.
// octal to decimal
01 // 1
02 // 2
07 // 7
010 // 8
020 // 16
// octal to binary (excluding most significant bit)
01 // 1
02 // 10
07 // 111
010 // 1000
020 // 10000
There are 10 types of people, those who understand ternary, those who don't, and those who think this is a stupid joke.
Solution 3:
From the Java 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.
Solution 4:
Leading zero means the value is in octal. 8 is not an octal digit, no more than 2 is valid in binary or G is valid in hexadecimal.