public static void main(String[] args) {
int a = 1000;
int b = 0100;
int c = 0010;
System.out.println(a + b + c);
}
Para tontos, ¿verdad? Por lo que se puede leer, el código debe imprimir 1110 (1000 + 100 + 10), pero ¡sorpresa!, si lo ejecutamos el resultado será 1072.¿Cómo diablos?
Veamos que dice la especificación del lenguaje Java en la sección 3.10.1 llamada "Integer Literals":
An integer literal may be expressed in decimal (base 10), hexadecimal (base 16), or octal (base 8) (...) 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.O sea, que cada vez que el compilador encuentre un valor que comienze con 0 al cual le sigue un valor entre 0 y 7, interpretará el número como un valor octal y no como uno decimal. En el caso de nuestro ejemplo, los valores 0100 y 0010 serán interpretados como valores octales iguales a los decimales 64 y 8 respectivamente, de ahí que el resultado sea 1072 (1000 + 64 + 8) y no 1110.
Para evitar conflictos, el siguiente código no compilará ya que 08 y 09 no son valores octales válidos:
public static void main(String[] args) {
int a = 08;
int b = 09;
System.out.println(a + b);
}
Algo que hay que tener bien presente es que cuando un código usa mezclados ambos sistemas de numeración, es muy complicado encontrar errores y determinar cuándo es octal y cuándo decimal, así que es una buena práctica utilizar solamente valores decimales (por ser los más comunes), y cuándo no sea posible, simplemente nombrar la variable de forma tal que sea obvio que su valor es octal. Algo como en el siguiente ejemplo: public static void main(String[] args) {
int value = 10;
int octalValue = 010;
System.out.println(value + octalValue);
}
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.