Java maneja
diferentes rangos de valores: byte, short, int y long.
Lo normal, mientras no se indique lo contrario, es trabajar con enteros int.
Notación
En código fuente
los enteros se representan usando una serie de caracteres y una base de
representación. Normalmente se usan números decimales (base 10) que emplean los
caracteres '0', '1', '2', '3', '4', '5', '6', '7', '8' y '9'. El valor de un
número se calcula multiplicando cada carácter por la potencia de 10
correspondiente a su posición.
Ejemplo:
2005 → 2 103 + 0 102 + 0 101 + 5 100
En general:
cn cn-1 ... c1 c0 → cn 10n + cn-1
10n-1 + ... + c1 101 + c0 100
Esta notación se
puede generalizar para trabajar en cualquier base, siendo frecuentes los
números en notación binaria (b = 2), octal (b = 8) y hexadecimal (b = 16):
cn cn-1 ... c1 c0 → cn bn + cn-1
bn-1 + ... + c1 b1 + c0 b0
En notación binaria,
b = 2, y se usan los dígitos '0' y '1'.
En notación
octal, b = 8, y se usan los dígitos del '0' al '7'.
En notación
hexadecimal, b = 16, y se usan los dígitos del '0' al '9' y las letras de la
'a' a la 'f'. De forma que 'a' (o 'A') vale 10; 'b' vale 11 y así sucesivamente
hasta la 'f' que vale '15'. A veces se usan letras minúsculas, a veces
mayúsculas: es indiferente.
El siguiente
código permite imprimir un valor numérico en diferentes notaciones:
void bases(int n) |
public void bases(int n) { System.out.println("decimal: " + n); System.out.println("binario: " + Integer.toBinaryString(n)); System.out.println("octal:
" + Integer.toOctalString(n)); System.out.println("hexadecimal:
" + Integer.toHexString(n)); System.out.println("base 3: " + Integer.toString(n, 3)); } |
bases(2001) |
decimal: 2001 binario: 11111010001 octal: 3721 hexadecimal: 7d1 base 3: 2202010 |
Java permite
escribir en el código fuente números:
·
en
notación decimal: como estamos acostumbrados (ej. 2001)
·
en
notación octal: empezando por '0' (ej. 03721)
·
en
notación hexadecimal: empezando por '0x' (ej. 0x7d1)
Si no se dice
nada, el valor se interpreta con formato “int”. Si se quiere forzar la
representación:
·
para
que el valor sea “long”, debe terminarse con la letra “l” o “L”:
·
ejemplo:
1L, que es la unidad en representación “long”
Conversión de
valores en String
Frecuentemente
tendremos los datos metidos en una String (por ejemplo porque los hemos leído
de un fichero de datos). La conversión a enteros de java se realiza de la
siguiente manera:
int n = Integer.parseInt(cadena); // notación decimal, b= 10 int n = Integer.parseInt(cadena, b); // base b |
Valores fuera
de rango
¿Qué pasa si nos
salimos de rango? NADA BUENO.
Cada tipo de
enteros, byte, short, int y long, se caracterizan por un valor
mínimo (el entero más negativo que se puede representar) y un valor máximo (el
mayor entero positivo que se puede representar). Si una operación aritmética
nos lleva fuera de ese rango el resultado es difícilmente predecible.
Por ejemplo, los int
deben estar en el rango [-2.147.483.648, +2.147.483.647]. Pero ...
2147483647 + 1 = -2147483648
-2147483648 – 1 = 2147483647
1000000000 * 10 = 1410065408
Aunque el valor
calculado está evidentemente mal, java no avisa de forma alguna.
Ver "Desbordamiento".
¿Qué tipo de
enteros debo usar?
Java tiene un
especial cariño por los "int". Todos los números java los interpreta
como "int", salvo que se diga lo contrario.
Lo más normal es
que todos los enteros sean de tipo "int"; salvo que haya una
necesidad evidente de recurrir a otro de los tipos:
·
byte
o short, porque tenemos muchísimos enteros con valores muy pequeños
·
long,
porque tenemos enteros con valores muy grandes
Temas relacionados