martes, 17 de mayo de 2016

El error de la base octal en Java



Todo empezó con una sencilla pregunta

¿Cuál es el resultado de la siguiente línea de código en java?:
int suma = 023 + 010;
System.out.println(suma); 
Pero utilizar la regla de "el cero a la izquierda no tiene valor" es la alternativa equivocada:
Lo que en lenguaje natural procesamos como una suma de resultado = 33;
para Java, el 0 a la izquierda se utiliza para expresar números en base 8, por lo que la suma tiene un resultado distinto:
  • 023 = 2*8 + 3 = 19:
  • 010 = 1*8 + 0 = 8;
  • 19 + 8 = 27.

Pueden comprobarlo en este compilador online, copiando/pegando las líneas de código puestas arriba.

Entonces, dicho con expresiones Java: 23 != 023
Y nótese que hasta el analizador web de sintaxis los muestra de distintos colores.

Bases aritméticas en Java

Java comprende el uso de base decimal, hexadecimal, octal y binaria.
Y se utilizan de la siguiente manera:
// Base decimal (10), comprende dígitos [0-9]
int decimal = 495; 
// Base hexadecimal (16), empieza con 0x o 0X, comprende dígitos y letras [0-9A-Fa-f]
int hexa = 0x1EF;  
// Base octal (8), empieza con 0, comprende dígitos [0-7]
int octal = 0757; 
// Base binaria (2), empieza con 0b o 0B, y comprende dígitos [0-1]
int binario = 0b111101111;
¿El problema es el lenguaje natural, o el problema es java?

Así como el error de interpretación; puede surgir un error de concatenación (para algoritmos de seguridad y encriptación, por ejemplo)
Entonces, pensando en calcular un número, internamente Java calculará su equivalente en base octal... lo que potencialmente podría significar un error.

Mi propuesta:
Como la gente de Sun Microsystems Oracle sigue diariamente mi humilde blog, propongo que -tal cual base 2 y base 16, utilicen una notación especial para base 8: 0b, 0x, y 0o respectivamente.
(Y no, el "0" no se confunde con la "o", porque hasta la RAE ya eliminó la "ó" usada antiguamente para diferenciarla del cero).
Así que aquí la lanzo, aunque sea otra idea muerta en el ciberespacio.



Recibe en tu correo electrónico las últimas actualizaciones de éste blog:
Ingrese su e-mail:
(y no olvide confirmar su suscripción)
También me encuentras en facebook. También en twitter. También en tumblr.