Sunteți pe pagina 1din 5

Aprendiendo Java EE

Aprendiendo Java EE desde cero (empezando con Java SE) Inicio Inicio Temas

T5. Operadores y tipos de datos (II)


9 OCTUBRE, 2010
tags: bool, char, conversin explcita, conversin implcita,
desbordamiento, double, float, java, javaee, javase, jee, jse, tipo de
datos, vector type and press enter

Siguiendo con el mismo tema, se van a explicar los tipos de datos que tiene Java para los B L O G S T A T S
nmeros reales, los booleanos y las cadenas. Tambin hablaremos del desbordamiento de una
S U S C R B E T E V A
83,930 hits
variable y las conversiones entre distintos tipos de datos y una introduccin a los vectores.
M A I L . . .
Escribe tu direccin de
Los nmero reales, como ya sabemos, estn compuestos por una parte entera y otra decimal. correo electrnico para A U T O R A
Los tipos de datos de Java para dichos nmeros son float y double. La diferencia entre ambos suscribirte a este blog y
tipos de datos est, como habremos intuido ya, en el rango de valores: un float puede tomar recibir notificaciones de
valores entre 3,410-3 8 y 3,4*1038 , mientras que un double puede tomar valores entre nuevas entradas por email.
1,7 *10-308 y 1,7 *10308 . nete a otros 16 seguidores
Introduce tu direccin de correo electrnico
El problema de los float y double es que siempre son valores aproximados ya que dependen de la Suscrbeme!
exactitud con la que se han almacenado. Esto quiere decir que, por ejemplo, al comparar dos
nmeros reales de forma exacta, el resultado podra no ser el deseado debido a la prdida de
O M E D I AM NI T TE W EI LT T E R
exactitud. Un ejemplo de la inexactitud de almacenamiento de dichos tipos de datos, podra se el
F E E D : Error: Twitter no responde.
siguiente (el cdigo se puede sustituir en el proyecto Ejemplo que utilizamos en el tema anterior):
Por favor, espera unos
1 public static void main (String[] args) Subscribe in a reader
minutos y actualiza esta
2 {
3 float suma = 0; pgina.
4
5 suma = suma + (float)0.1; suma = suma + (float)0.1; L T I M O S T E M A S
6 suma = suma + (float)0.1; suma = suma + (float)0.1; A D M I N I S T R A
7 suma = suma + (float)0.1; suma = suma + (float)0.1; T5. Operadores y
8 suma = suma + (float)0.1; suma = suma + (float)0.1;
9 suma = suma + (float)0.1; suma = suma + (float)0.1; tipos de datos (II) Registrarse
10
11 System.out.println("El resultado total es: " + suma); T4. Operadores y Acceder
12 }
tipos de datos (I)
RSS de las entradas
Hay una primera cosa que se tendramos que observar en el cdigo de arriba: despus del punto
T3. Variables
y coma de cada instruccin se puede escribir cualquier otra instruccin. El punto y coma RSS de los
y constantes
determina el final de una instruccin, por lo tanto es lo que separa una instruccin de otra, o sea, comentarios
se pueden escribir cdigos en Java sin ningn tipo de estructura. Por supuesto, eso no es lo T2. Herramientas:
habitual (ni aconsejable) ya que seran programas difciles de entender incluso para el mismo WordPress.com
NetBeans
programador, no hablemos ya de personas ajenas al cdigo. Supongo que tambin os parecer
rara la utilizacin de (float)0.1. sto se explicar ms adelante. T1. Qu es Java?

Vale, pasemos al resultado del programa. Despus de compilarlo y ejecutarlo, claro, ste es
1.0000001. Hmmmm s, yo tambin estoy de acuerdo, matemticamente correcto el L I C E N C I A
resultado es 1.0. Este es un ejemplo de lo cuidadosos que deberamos ser con los nmeros reales
en Java.
Aprendiendo Java EE by Adi
Un ejemplo prctico de cmo podramos trabajar con los nmero reales es la comparacin de Venete is licensed under a
dos de stos. Debido a la prdida de exactitud al almacenar los nmeros, si los comparamos de la Creative Commons
forma convencional (con el operador de comparacin ==) el resultado puede no ser el deseado. Attribution-
O sea, hay que aproximar la comparacin. Lo mejor es comparar la diferencia de ambos respecto NonCommercial 3.0
a una constante que determine la exactitud de la operacin. Dejemos un ejemplo de sto para un Unported License.

converted by W eb2PDFConvert.com
poco ms tarde ya que an nos falta dar las sentencias de control de flujo (cmo se toma una
decisin? tema siguiente).
Los operadores utilizados al trabajar con los nmeros reales son los mismos que los utilizados al
trabajar con nmeros enteros (ver tema 4), por lo tanto, los smbolos utilizados tambin son los
mismos. Por otra parte, se ha de tener en cuenta lo siguiente:

1. Un valor literal (un nmero) que incluya decimales es, por defecto, un double.
2. El resultado de una operacin en la que aparece al menos un valor double es siempre de
tipo double.

3. En una operacin binaria en la que aparece un entero y un nmero real, el resultado ser
del tipo de datos del nmero real.
4. En las operaciones binarias que impliquen dos nmeros float, el resultado ser de tipo
float.

En cuanto a la segunda incgnita ( (float)0.1 ), es una conversin explcita de un double a un


float. Esto se justifica con la primera de las reglas de arriba: al escribir el nmero 0.1 sin antes
asociarlo a una variable, por defecto sera de tipo double, consecuentemente el resultado final
sera de tipo double tambin. Para nuestro ejemplo nos interesa que el resultado sea de tipo float
(adems, la variable suma la hemos declarado como float, o sea, tendramos un error si
intentamos asociar un valor double a una variable de tipo float). Esta conversin explcita es lo
que se llama un casting de tipos, y hemos de hacerla cuando el nuevo tipo de dato al que
queremos convertir nuestra variable o literal es incompatible o de un rango menor que el tipo de
dato que la variable o literal tiene actualmente. Por lo tanto, hemos de decirle al compilador
explcitamente el tipo de dato que queremos. Esto se hace, como hemos visto arriba, de la forma:

(tipo_destino) valor

Tambin se da el caso contrario, o sea, cuando los tipos de datos son compatibles y el tipo de
dato al que se quiere convertir es de un rango mayor que el tipo de dato que la variable o literal
tiene actualmente. En este caso el compilador hace la conversin automticamente. Esto se llama
conversin implcita de tipos de datos. De aqu es de donde se deriva la tercera regla de las de
arriba: en una operacin binaria en la que aparece un entero y un nmero real, el resultado ser
del tipo de datos del nmero real porque cualquier tipo de un nmero real tiene un rango mayor
que cualquier tipo de un nmero entero.
Creo que ste es un buen momento para hablar del desbordamiento. Un desbordamiento (u
Overflow, en ingls) se produce cuando una operacin aritmtica intenta almacenar un valor
numrico demasiado grande para la variable que lo contiene. Si aadimos 1 al valor mximo que
una variable puede almacenar (esto es, el rango que la contiene), la variable se desborda, se
producen errores. Estos errores pueden ser controlados por el lenguaje de programacin o no.
En Java, dependiendo del tipo de dato que se desborda, el error se controla o no. Esto se hace
con las llamadas excepciones. Por ahora no hace falta saber dicho concepto, as que se estudiar
ms adelante.

De todos modos, para acabar de entender que es el desbordamiento y de que forma puede
aparecer en nuestro programa, veamos un sencillo ejemplo:
1 public static void main(String[] args)
2 {
3 int num1 = 2147483647, resultado = 0;
4
5 resultado = num1 + 1;
6 System.out.println("El resultado de sumar " + num1 +
7 " y el nmero 1 es: " + resultado);
8 }

Si compilamos y ejecutamos, observamos que el compilador de Java no nos da ningn error, sin
embargo el resultado no es el esperado: -2147 483648. Esto se debe a que para los nmero de
tipo entero, Java no da errores. Lo que se ha hecho al llegar al lmite del rango aceptado por
un int, ha sido empezar desde el principio. Esto es, se ha empezado con el nmero ms pequeo
del rango de un int: -2147 483648. Tenemos que ser muy cuidadosos con los desbordamientos.

Otro tipo primitivo de datos en Java es el boolean. Un boolean tiene un tamao mximo de 1

converted by W eb2PDFConvert.com
byte, pero no es un valor numrico: slo admite los valores true o false (verdadero o falso).
Este tipo de datos se utiliza con los operadores lgicos y (&&), o (||) y la negacin (!). Podremos
ver algn ejemplo en Java en el tema de estructuras de control (el siguiente tema), mientras
tantos, veamos un ejemplo en pseudocdigo:

boolean op1 = true, op2 = false;


SI ((op1 && op2) == true):
ImprimirPorPantalla(Los operadores tienen el valor true)
SI NO es as:
ImprimirPorPantalla(Los operadores NO tienen el valor true)
op1 = false
SI ((op1 && op2) == false):
ImprimirPorPantalla(Los operadores tienen el valor false)

Qu creis que se imprimir por pantalla? La siguiente tabla nos dar una idea ms aproximada:

Operador Formato Nombre Descripcin


&& op1 && op2 Y lgico Devuelve true si son ciertos op1 y op2

|| op1 || op2 O lgico Devuelve true si son ciertos op1 o op2

! ! op1 Negacin lgica Devuelve true si es false op1


== op1 == op2 Igualdad Devuelve true si los operadores son
iguales

!= op1 != op2 Desigualdad Devuelve true si los operadores son


distintos
As, en la primera condicin, (op1 && op2), con op1 = true y op2 = false, sabemos, segn la
primera fila de la tabla de arriba, que el resultado es false. Por lo tanto, lo que ser imprimira por
pantalla, sera la segunda condicin: SI NO es as: ImprimirPorPantalla(Los operadores NO
tienen el valor true). En resumen, el resultado en pantalla sera:

Los operadores NO tienen el valor true


Los operadores tienen el valor false

Tambin se les pueden aplicar operadores como menos que, mayor que, menor o igual que
y mayor o igual que vistos en el tema 4.

Por ltimo, vamos a ver el tipo de datos char (un literal) que representa un carcter (puede
tomar valores entre 0 y 65535, lo que es lo mismo, ocupa 2 bytes caracteres en UNICODE).
Un char se declara como un carcter entre comillas simples. Veamos un ejemplo:
1 public static void main(String[] args)
2 {
3 char car1 = 'a', car2 = 'b';
4 System.out.println("La variable car1 contiene el carcter: " + car1);
5 System.out.println("La variable car2 contiene el carcter: " + car2);
6
7 car1 = 'c';
8 System.out.println("La variable car1 contiene el carcter: " + car1);
9
10 char car3[] = {'A', 'D'};
11 System.out.println("La variable car3 contiene los caracteres: " +
12 car3[0] + " y " + car3[1]);
13 }

Compilamos y ejecutamos (Shift + F6), y vemos como se imprime por pantalla los contenidos de
las respectivas variables tal como los hemos asignado (o reasignado, en el caso de car1). En
cuanto a car3, acabamos de definir lo que se llama un vector. Un vector se utiliza para
almacenar valores del mismo tipo, en la misma variable. En el caso que con concierne, hemos
almacenado varios caracteres en una misma variable de tipo char. Un vector se puede declarar
de una de las siguientes maneras en Java:

converted by W eb2PDFConvert.com
1) tipo nombreDelVector[ ]
2) tipo[ ] nombreDelVector

En nuestro ejemplo, se ha utilizado la primera forma para declarar la variable car3. Tambin se
pueden declarar vectores de ms de una dimensin:

tipo nombreDelVector[][]

Que tendra dos dimensiones, lo que es lo mismo, sera una matriz bidimensional. Otra cosa que
se puede hacer es indicar el nmero de elementos que el vector tendr, durante la declaracin
(slo si el vector es unidimensional):

tipo vector1 [5]

As, el vector1 tendr como mximo 5 elementos del tipo indicado. Los elementos de un vector
empiezan a contarse desde 0. Los elementos del vector1, por ejemplo, seran
vector1[0], vector1[1], vector1[2], vector1[3] y vector1[4], cinco elementos en total. Una cosa
importante que hay que tener en cuenta es que, al declarar un vector, el nmero de elementos
que se le asigna en la declaracin no se puede cambiar. Si no indicamos el nmero de elementos
en la declaracin, el nmero de elementos que se asignan en la inicializacin del vector, ser el
mximo nmero de elementos que pueda contener. Vemoslo con un ejemplo:
1 public static void main(String[] args)
2 {
3 char car[] = {'a','b','c'};
4 System.out.println("La variable car contiene los caracteres: " +
5 car[0] + car[1] + car[2]);
6
7 car[0] = 'd';
8 System.out.println("El nuevo valor asignado a car[0] es : " + car[0]);
9
10 car[3] = 'e';
11 System.out.println("El valor asignado a car[3] es : " + car[3]);
12 }

Al compilar, uno de los errores que tenemos es el siguiente:

Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 3

Lo que el compilador intenta decirnos, es que no hay ninguna posicin 3 en el vector, no se le


puede asignar un valor a una posicin no perteneciente al vector. Si quitamos las ltimas dos
lneas del programa, el cdigo compilar correctamente. Como de costumbre, veremos ms
ejemplos en los temas siguientes.

Ejercicio desbordamiento:
Escribir un programa en Java que sume dos nmero de tipo short para que el resultado se
desborde. Imprimir por pantalla el resultado.

Solucin:

+ expand source

Ejercicio 1:
Inicializar una matriz de enteros (int) de 22 con valores de 1 a 4. Sumar dichos valores
(utilizandolos desde la matriz), guardar el resultado en una variable suma, e imprimir el el valor
final por pantalla.

Solucin:

+ expand source

converted by W eb2PDFConvert.com
Tu voto:

1 Vote
Cargando...

from Jav a SE, Operadores y tipos de datos (II)

T4. Operadores y tipos de datos (I)

One Comment leave one

Sandra PERMALINK
16 abril, 2012 15:16
Seguira el curso ???? Es muy Bueno. Gracias
5 0 Rate This
RESPONDER

Responder

Introduce aqu tu comentario...

Blog de WordPress.com.

converted by W eb2PDFConvert.com

S-ar putea să vă placă și