¿Por qué 08 no es un literal entero válido en Java?
¿Por qué se 08
considera un int fuera de rango pero 07
los siguientes no lo son?
En Java y varios otros lenguajes, un literal entero que comienza con 0
se interpreta como una cantidad octal (base 8).
Para números de un solo dígito (excepto 08
y 09
, que no están permitidos), el resultado es el mismo, por lo que es posible que no notes que se interpretan como octales. Sin embargo, si escribe números con más de un dígito significativo, el resultado podría confundirlo.
Por ejemplo:
010 == 8
024 == 20
Dado que los literales octales generalmente no son lo que desea, siempre debe tener cuidado de no comenzar nunca un literal entero con 0
, a menos, por supuesto, que en realidad esté intentando escribir cero por sí mismo.
Cualquier número con el prefijo 0 se considera octal. Los números octales solo pueden usar dígitos del 0 al 7, al igual que los decimales pueden usar del 0 al 9 y los binarios pueden usar del 0 al 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
Hay 10 tipos de personas, las que entienden el ternario, las que no y las que piensan que esto es una broma estúpida.
De la especificación de Java :
Un número octal consta de un dígito ASCII 0 seguido de uno o más dígitos ASCII del 0 al 7 y puede representar un número entero positivo, cero o negativo.