enteros

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

119. Números (concepto)