Sei sulla pagina 1di 8

Elementos de Programaci on. ETSIT.

1o C, Apuntes del profesor Juan Falgueras 2002/03

4 Tipos de datos simples


Contenido
4. Tipos de datos simples 4.1. Concepto de tipo de dato . . . . . . . . . . . . 4.1.1. Tipos simples y estructuras . . . . . . . 4.1.2. Cardinalidad (#) . . . . . . . . . . . . . 4.2. Tipos simples predenidos . . . . . . . . . . . . 4.2.1. Conversi on impl cita en las operaciones 4.3. Tipos simples denidos por el programador . . 4.4. Tipos enumerados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 3 5 7 7

4.

Tipos de datos simples


En los temas anteriores hemos ido viendo c omo funcionan los computadores, qu e son capaces de resolver y qu e lenguaje es el que entienden. En este tema vamos a hacer un par entesis para aclarar los tipos de datos simples (en contraste con los estructurados que iremos describiendo m as adelante), tipos algunos, que ya hemos visto en ejemplos antes y que en este tema presentaremos de manera jerarquizada e interrelacionada.

4.1.

Concepto de tipo de dato

Un tipo de dato es un sistema de codicaci on, de manipulaci on y de almacenamiento de informaci on u ltima. Cuando en computaci on se habla de tipo de dato inmediatamente se est a entendiendo un contexto, que implica operaciones con esos datos. La idoneidad de un tipo de datos para guardar una informaci on de manera completa y f acil de utilizar depende fundamentalmente de las operaciones que tal tipo de datos permita; tambi en de las m as o menos adecuadas restricciones impuestas a sus valores, tambi en del esfuerzo computacional necesario para operar con el y, en u ltima instancia, del volumen de memoria que requiera su almacenamiento. En resumen, podemos pues decir, que un tipo de datos es un conjunto de posibles valores y conjunto de posibles operaciones sobre ellos. Entre las operaciones deben aparecer aquellas que los modiquen para permitir que el almacen pueda contener los diversos valores permitidos. Tambi en operaciones de lectura de la informaci on, que, en denitiva no ser an m as que operaciones de copia de la misma informaci on y de conversi on a formatos/codicaciones distintas que posibiliten su representaci on. Por ejemplo: un tipo de datos muy importante es el tipo de datos booleano, capaz de recoger y manipular informaci on sobre los dos valores del algebra de Boole; a saber, cierto y falso. Operadores t picos sobre estos valores son su negaci on, o la asignaci on de estas etiquetas cierto y falso sobre uno de los contenedores para ese tipo de datos. Pero tambi en es fundamental el poder copiar esa informaci on de un contenedor booleano a otro de ese mismo tipo as como, leer la informaci on contenida en uno de esos contenedores o compararla con los valores conocidos cierto y falso. Muchos de los m as extendidos lenguajes de programaci on (aunque no todos), incluyen el tipo de datos booleano entre sus tipos b asicos se puede operar con ellos, se pueden crear variables de

4.1

Concepto de tipo de dato

ese tipo, etc. Otros lenguajes que los pueden simular con m as o menos facilidad, en base a otros tipos m as complejos. Por ejemplo, el Lenguaje de Programaci on C originalmente no ten a tal tipo de datos pero es posible, como veremos crearlo con mucha facilidad sobre otro tipo de datos, el tipo entero1 . 4.1.1. Tipos simples y estructuras

Cuando un tipo de datos mediante alg un m etodo de selecci on permite extraer de el partes de su informaci on, se dice que est a estructurado, que es una estructura de datos. Por ejemplo, si tuvi esemos un tipo de datos para contener fracciones, podr amos tener acceso al numerador y al denominador, y al signo. Los componenentes de un tipo estructurado pueden a su vez ser estructuras de datos, etc. Un tipo estructurado es pues, divisible en varios datos m as simples y por eso se le llama polil tico frente a los no descomponibles en datos m as simples, que ser an monol ticos. Hay que entender que los componentes de un tipo estructurado deben ser entre s independientes de manera que la modicaci on de una parte no implique modicaci on de las otras. Y que la informaci on de cada parte se pueda manipular de manera independiente. Podr amos pensar equivocadamente que el n umero entero es un tipo estructurado con un valor absoluto y un signo, pero esto implicar a que operaciones como suma, resta, multiplicaci on, etc, entre ellos, podr an dar lugar a valores que afectar an a la otra parte. Mientras no haya operaciones que manipulen de manera independiente cada parte de la informaci on no se debe hablar de tipo estructurado.

Tipos de datos
Simples o escalares Compuestos o estructurados Definidos por el programador Predefinidos R Ordinales N Z C {,enumerados,} B

*punteros

[arrays] {;registros;}

Figura 1: Esquema de los tipos de datos.

4.1.2.

Cardinalidad (#)

El n umero de posibles estados (o valores) que puede tener un tipo de datos es su cardinalidad (#). En general, si todo el espacio (Nbits) es aprovechado para la representaci on, tendr amos: NBits = log2 (#)
1 El lenguaje de programaci on C, desarrollado originalmente por Dennis Ritchie en la BTL, ahora ATT. Hered o de lenguajes como BCPL y B (1970), que eran lenguajes de bajo nivel sin tipos predenidos. C estuvo connado en los laboratorios Bell hasta 1978, a no en el que Brian Kernighan y Dennis Ritchie publicaron una descripci on del lenguaje. La denici on inicial de K. y R. se denomina usualmente K&R C. Para evitar diferencias en el comportamiento de los compiladores de C que fueron proliferando, se estableci o un est andard, el ANSI X3J11. Hasta la fecha, la u ltima revisi on estandarizada del lenguaje C est a recogida en ISO-IEC JTC1-SC22-WG14 N843.

4.2

Tipos simples predenidos

a n t e A s d e s A p u s

B B=A

Figura 2: Asignaci on entre dos variables.

a n t e s d e s p u s

A=3.1416 A

Figura 3: Asignaci on de un valor literal sobre una variable. Si el tipo de datos fuese estructurado y contuviese N componentes, cada uno de cardinalidad #i , tendr amos que la cardinalidad total ser a:
N

#=
i=1

#i

4.2.

Tipos simples predenidos

Cuando un tipo de datos es monol tico se dice que es simple. Si adem as el tipo de datos (con sus operaciones impl citas) est a inclu do entre los tipos de datos que el Lenguaje de Programaci on es capaz de gestionar (proporcionando el propio lenguaje tanto el m etodo de codicaci on como las rutinas adecuadas), es llamado predenido. Naturalmente cada lenguaje tiene predenidos diferentes tipos de datos, pero pr acticamente todos los lenguajes tipados (orientados a tipos) tienen

4.2

Tipos simples predenidos

A != B

A == B

3.1416 == B

Figura 4: Comparaci on entre variables de igual tipo y entre una variable y un valor literal de ese tipo. predenidos los siguientes: B C, $ N Z R Booleano Letra Natural Enteros Reales valores de verdad del algebra de Boole letras, caracteres, de la tabla ASCII n umeros naturales ( 0) n umeros enteros n umeros con decimales

De estos, todos menos el u ltimo, son denominados ordinales y disponen, de operadores siguiente y predecesor. En el caso de los booleanos esto es algo un tanto articioso pero se conviene en que el siguiente de falso es cierto. Naturalmente el menor de todos no tiene predecesor como no tiene siguiente el mayor de todos. De hecho el tratamiento interno que los ordenadores hacen de los tipos ordinales es muy semejante entre ellos y suele ser mucho m as eciente que el que hay que hacer con los reales, mucho m as costosos computacionalmente de manipular. Esto hace que los tipos reales s olo se utilicen cuando el problema sea estrictamente de c alculo num erico aproximado. Muchos problemas no requieren del uso de n umeros reales y el c alculo num erico suele resolverse de forma exacta mediante n umeros enteros o naturales. Los operadores de los booleanos son , representado por NOT, , representado por AND y , representado por OR. Los de los enteros y naturales son los mismos y hay que tener en cuenta que la divisi on de enteros es siempre un n umero entero, de manera que resulta muy u til un operador resto, se tiene , +, *, DIV, % que tambi en se dice MOD. Se tiene que 7DIV3 = 2 y 7 %3 = 1. Con los n umeros negativos estos operadores no est an claramente denidos, dependiendo del lenguaje. En algunos lenguajes el operador de divisi on entera, DIV, se representa mediante la barratr as \. Los caracteres o letras tienen pocos operadores: convertir un c odigo num erico ASCII en la letra correspondiente, que en realidad, es externo: CHR : N C

4.2

Tipos simples predenidos

y la contraria ORD : C N que devuelve el c odigo ASCII de una letra. Algunos lenguajes menos fuertemente tipicados no distinguen pr acticamente entre los tipos letra (aunque los tengan predenidos) y el propio tipo entero, de manera que carecen de estos dos u ltimos operadores. As le pasa al Lenguaje de Programaci on C. 4.2.1. Conversi on impl cita en las operaciones

Al operar entre distintos tipos los procesadores normalmente son m as restrictivos que los lenguajes de programaci on de alto nivel. Por ejemplo, un procesador es capaz de sumar dos n umeros enteros de 16 bits, pero no uno de 16 y otro de 32. Lenguajes como C, por ejemplo, y otros muchos, no siendo estrictos en el control de tipo son m as exibles en su combinaci on en las operaciones. En los lenguajes poco restrictivos se dan dos tipos de conversiones: impl cita que realiza el compilador sin la participaci on del programador. expl cita que hace el programador mediante operadores de adaptaci on (casting ) de tipos. Las conversiones de tipo impl citas son peligrosas si no se conocen ya que pueden dar lugar a resultados inesperados. Las conversiones impl citas se producen: entre operandos de expresiones l ogicas y/o aritm eticas cuando los operandos no tienen el mismo tipo (llamadas conversiones aritm eticas usuales), cuando el tipo de la expresi on resultante a la derecha de una asignaci on no encaja con el tipo del destino a la izquierda de la asignaci on, cuando el tipo del argumento en la llamada a una funci on no encaja con el tipo del correspondiente par ametro que se espera en la funci on, cuando el tipo del resultado que se espera devuelva una funci on no es el mismo que el de la expresi on tras el Devolver (return) de la misma. Uno de los tipos de conversi on impl citos m as frecuentes es el de las conversiones aritm eticas usuales , que se dan entre la mayor a de los operadores binarios, incluyendo los aritm eticos, relacionales y operadores de igualdad. Si, por ejemplo, x es de tipo R e i de tipo Z, la conversi on aritm etica usual se producir a entre en alguno de los dos operandos. En este caso, los m as able es convertir i en R ya que lo peor que en este caso puede ocurrir es una p erdida m nima de precisi on. La conversi on de un n umero real en entero tiene mucho mayor coste en general al perderse toda la parte decimal, que, incluso, puede ser toda la parte signicativa de x, dando 0 como resultado de la conversi on. La estrategia que se utiliza es la de convertir el valor al tipo m as peque no que los pueda contener a los dos. Esta peque nez no tiene por que ser necesariamente el n umero de bytes. En general el tipo m as limitado se convierte al m as amplio de los de los dos operandos, promocionando su tipo. En C, entre las promociones de tipo entero (entre tipos enteros u ordinales, que en C son m as o menos iguales), se pueden convertir a entero tanto enumerados, como caracteres o enteros m as o menos peque nos. As , si alguno de los operandos es real, en C, la promoci on por orden de amplitud ser a: long double double float

4.2

Tipos simples predenidos

char c; short int s; int i; unsigned int u; long int l; unsigned long int ul; float f; double d; long double ld; i i u l ul f d ld = = = = = = = = i i u l ul f d ld + c; + s; + i; + u; + l; + ul; + f; + d; // // // // // // // // c se convierte en int s se convierte en int i se convierte en unsigned int u se convierte en long int l se convierte en unsigned long int ul se convierte en float f se convierte en double d se convierte en long double

Figura 5: Ejemplos de conversiones aritm eticas usuales en el lenguaje C. Si ninguno de los operandos es de tipo real, en C, esto incluye los caracteres, booleanos y enumerados, primero se convierte a int y despu es se aplica la promoci on que corresponda al m as amplio de los operandos: unsigned long int long int unsigned int int C da resultados inesperados, por ejemplo, cuando compara un valor i de tipo Z que vale 10 con un valor u de tipo N, que valga 10. Al promocionarse el entero a unsigned el bit de signo no se puede convertir y se toma (recordemos que estamos en complemento a dos) el valor como si fuese positivo, dando el resultado contrario al esperado. Como ejemplos, ver la Ejemplo de la Figura 5. Sin embargo la conversi on durante la asignaci on puede ser menos feliz, ya que: si la parte derecha es tan amplia o menos que el destinatario no habr a problemas, como por ejemplo, con c de tipo C en i = c; siendo i de tipo Z, el valor de c su posici on en la tabla ASCII se guarda en i, sin p erdidas, si a la derecha hay un n umero real con decimales, se trunca la parte decimal (sin redondeo) 9,99 se convierte en 9; el resultado a la izquierda es impredecible si la expresi on a asignar no cabe. Por todo esto es conveniente la adaptaci on de tipos. En C, por ejemplo, esta adaptaci on se hace poniendo antes del valor o la expresi on o la variable el nuevo tipo deseado entre par entesis: (nombreTipo) expresi on

4.3

Tipos simples denidos por el programador

esto permite un mayor control y evita situaciones inesperadas para el programador. En algunos casos incluso la adaptaci on es necesaria para evitar desbordamientos en los c alculos en la expresi on, cuyo resultado, aunque cabe en el destinatario, no cabe en el tipo de los operandos de la expresi on:
long int i; int j = 1000; i = j * j; i = (long int) j * j; i = (long int) (j * j); // dar a error por desbormiento // da el resultado esperado // da error, antes de la conversi on.

4.3.

Tipos simples denidos por el programador

Se pueden denir f acilmente mediante declaraciones como:


tipo <C omoConstruirlo> IdentDeEsteNuevoTipo;

Por ejemplo:
tipo R LONGITUD;

declarar a que el tipo LONGITUD es un n umero real. As se pueden despu es declarar objetos de tipo LONGITUD que ser an de distinto tipo, al menos formalente, que los de tipo VOLUMEN, declararo de manera an aloga.

4.4.

Tipos enumerados

Uno de las grandes ventajas de la creaci on de tipos nuevos es la de aclarar el c odigo para los programadores. Esta ventaja es evidente con los tipos enumerados. Los tipos enumerados dan nombre a cada valor de los que puede almacenar. Por ejemplo, si queremos almacenar un valor de tipo color aditivo, tendr amos el ROJO, el VERDE y el AZUL. As que qu e manera mejor de manipular variables de este tipo que explicitando los posibles valores as etiquetados:
tipo enum {ROJO, VERDE, AZUL} COLORAD;

n otese que los lenguajes de programaci on exigiran que se anteponga alguna palabra reservada (como enum en el caso de C) antes del explicitar la lista de valores etiquetada. F acil es de reconocer el tipo:
tipo enum {FALSE, TRUE} bool;

que permitir a a variables de tipo bool recibir valores FALSE (por ejemplo, encontrado= FALSE;) o TRUE. En el caso del Lenguaje de Programaci on C original, que carec a de esta denici on, hay que tener cuidado al hacer la creaci on de este tipo en poner las etiquetas en ese orden. El motivo es el siguiente: A nivel interno, el compilador considera cada etiqueta conforme las encuentra en la declaraci on como un n umero natural contando desde 0. As para el compilador, cada vez que el programador escribe FALSE se codica 0 y cada vez que encuentra TRUE, 1. Por otro lado el Lenguaje de Programaci on C en las expresiones booleanas que aparecen por doquier entiende que un resultado falso, por ejemplo, 3 < 2, es sencillamente 0. Un resultado cierto 2 < 3 vale 1 (en realidad no 1, sino algo distinto de 0). En C se puede forzar el valor con el que queramos que se codique la etiqueta (cosa que puede ser u til en alg un sitio). Por ejemplo:

4.4

Tipos enumerados

tipo enum {MEDDOC=6, DOCENA=12, CARTON=36} CANTHUEVOS;

Juan Falgueras Dpto. Lenguajes y Ciencias de la Computaci on Universidad de M alaga Despacho 3.2.32

Potrebbero piacerti anche