Tipos de datos

Recuerde las operaciones aritméticas que realizaba el proyecto operaciones.cpp. Por ejemplo, una de las operaciones que realizábamos era la suma de dos valores.

tipos_de_datos1

Para que el compilador C++ reconozca esta operación se necesita especificar previamente el tipo de cada uno e los operandos que intervienen en la misma, así como el tipo del resultado. Para ello, añadimos lo siguiente:

tipo_de_datos_2

La declaración anterior le indica al compilador C++ que dato1, dato2 y resultado son de tipo entero (int). También podemos observar que se puede declarar más de una variable del mismo tipo utilizando una lista separada por comas.

 El C++, como cualquier otro lenguaje de programación, tiene posibilidad de trabajar con datos de distinta naturaleza: texto formado por caracteres alfanuméricos, números enteros, números reales con parte entera y parte fraccionaria, etc. Además, algunos de estos tipos de datos admiten distintos números de cifras (rango y/o precisión), posibilidad de ser sólo positivos o de ser positivos y negativos, etc. En este apartado se verán los tipos fundamentales de datos admitidos por el C++. Más adelante se verá que hay otros tipos de datos, derivados de los fundamentales. Los tipos de datos fundamentales del C++ se indican en la Tabla:

tipodatos_1

Recuérdese que en C++ es necesario declarar todas las variables que se vayan a utilizar. Una variable no declarada produce un mensaje de error en la compilación. Cuando una variable es declarada se le reserva memoria de acuerdo con el tipo incluido en la declaración. Es posible

inicializar –dar un valor inicial– las variables en el momento de la declaración; ya se verá que en ciertas ocasiones el compilador da un valor inicial por defecto, mientras que en otros casos no se realiza esta inicialización y la memoria asociada con la variable correspondiente contiene basura informática (combinaciones sin sentido de unos y ceros, resultado de operaciones anteriores con esa zona de la memoria, para otros fines).

tipo_de_datos_2

Asignar valores

La finalidad de un programa es procesar datos numéricos y cadenas de caracteres para obtener un resultado. Estos datos generalmente, estarán almacenados en variables. La manera de almacenar un dato en una variable es:

asignar

Las sentencias de asignación son asimétricas. Es decir, que se evalúa la expresión que está a la derecha del operador de asignación (=) y el resultado se asigna a la variable especificada a la izquierda. Por ejemplo:

resultado_dato1_dato2

asignar_2

Más adelante veremos como se almacena las variables string.

Añadir comentarios

Un comentario es un mensaje a cualquiera que lea el código fuente. Añadiendo comentarios se hace más fácil la compresión de un programa. La finalidad es la de explicar el código fuente. Podemos usar comentarios de bloque o de una sola línea.

comentarios

Variable tipo char

Las variables carácter (tipo char) contienen un único carácter y se almacenan en un byte de memoria (8 bits). En un bit se pueden almacenar dos valores (0 y 1); con dos bits se pueden almacenar 2² = 4 valores (00, 01, 10, 11 en binario; 0, 1, 2, 3 en decimal). Con 8 bits se podrán almacenar 2⁸ = 256 valores diferentes (normalmente entre 0 y 255; con ciertos compiladores entre -128 y 127).

byte_bit

La declaración de variables tipo carácter puede tener la forma:

declaracion_char

Como vemos también se puede declarar más de una variable de un tipo determinado en una sola sentencia. Se puede también inicializar la variable en la declaración. Por ejemplo, para definir la variable carácter letra y asignarle el valor a, se puede escribir:

asigna_letra_1

o podemos también asignarlo de la siguiente manera:

signed_char_a

A partir de ese momento queda definida la variable letra con el valor correspondiente a la letra a. Recuérdese que el valor ‘a’ utilizado para inicializar la variable letra es una constante carácter. En realidad, letra se guarda en un solo byte como un número entero, el correspondiente a la letra a en el código ASCII, que se muestra en la Tabla siguiente para los caracteres estándar (existe un código ASCII extendido que utiliza los 256 valores y que contiene caracteres especiales y caracteres específicos de los alfabetos de diversos países, como por ejemplo las vocales acentuadas y la letra ñ para el castellano).

tabla_ASCII

Por ejemplo para saber el código ASCII de la letra a, debemos apuntar el número que está en la fila que contiene la letra a, y acto seguido el número de la columna donde se halla la mencionada antes letra a. Por ejemplo según la tabla:

ASCII97

 Con lo cual el código ASCII de la letra a quedaría almacenado en la memoria  como binario (01100001) de un byte (8 bits).

BIN97_A

 Volviendo al ejemplo de la variable letra, su contenido puede ser variado cuando se desee por medio de una sentencia que le asigne otro valor, por ejemplo:

letra_zTambién puede utilizarse una variable char para dar valor a otra variable de tipo char:

caracter_zComo una variable tipo char es un número entero pequeño (entre 0 y 255), se puede utilizar el contenido de una variable char de la misma forma que se utiliza un entero, por lo que están permitidas operaciones como:

mayuscula_minuscula

En el primer ejemplo, si el contenido de letra era una z al incrementarlo en + 1 pasa a convertirse en el carácter {. El segundo ejemplo es interesante: puesto que la diferencia numérica entre las letras minúsculas y mayúsculas es siempre la misma 32 (según el código ASCII), la segunda sentencia pasa una letra mayúscula a la correspondiente letra minúscula sumándole dicha diferencia numérica.

 Variable tipo bool

En una variable tipo bool se almacena un único valor en ese byte de memoria. Este valor puede ser 0 ó 1, donde el 0 corresponde a la sentencia false y el uno corresponde a la sentencia true. Estas variables no se utilizan para almacenar datos, sino para controlar el flujo de ejecución, es decir, para dirigir las bifurcaciones y los bucles.

bool

Como vemos por definición true toma el valor de 1 y false el valor 0, y a la inversa, cualquier valor entero distinto de cero se convierte en true y cero en false.

Números enteros (tipo int)

De ordinario una variable tipo int se almacena en 4 bytes (32 bits). Declara datos enteros comprendidos entre  -2147483648 y +2147483647 (32 bits de longitud).

32bits

 Variables enteras (tipo long)

Aunque lo habitual es que una variable tipo int ocupe 4 bytes, en algunos compiladores no se le asignan más que 2. Para evitar este problema se puede anteponer la palabra long, que asegura que la variable alcance esos 4 bytes. De esta manera el rango de la variable será el correspondiente al tipo int habitual.

 Variables enteras(tipo short)

Existe la posibilidad de utilizar enteros con un rango menor si se especifica como tipo short en su declaración:

short_int

la misma declaración omitiendo int:

shortEl rango de un entero short puede variar según el computador o el compilador que se utilice, pero de ordinario se utilizan 2 bytes (16 bits) para almacenarlos, por lo que se pueden representar 2¹⁶ = 65.536 números enteros diferentes. Si se utilizan números con signo, podrán representarse números entre –32.768 y 32.767.

16bits

 También se pueden declarar enteros short que sean siempre positivos con la palabra unsigned:

unsigned_short

Variables reales (tipo float)

En muchas aplicaciones hacen falta variables reales, capaces de representar magnitudes que contengan una parte entera y una parte fraccionaria. Estas variables se llaman también de punto flotante. De ordinario, en base 10 y con notación científica, estas variables se representan por medio de la mantisa, que es un número mayor o igual que 0.1 y menor que 1.0, y un exponente que representa la potencia de 10 por la que hay que multiplicar la mantisa para obtener el número considerado. Por ejemplo, π se representa como 0.3141592654 · 10¹ . Tanto la mantisa como el exponente pueden ser positivos y negativos.

Los computadores trabajan en base 2. Por eso un número de tipo float se almacena en 4 bytes (32 bits), utilizando 24 bits para la mantisa (1 para el signo y 23 para el valor) y 8 bits para el exponente (1 para el signo y 7 para el valor). Es interesante ver qué clase de números de punto flotante pueden representarse de esta forma. En este caso hay que distinguir el rango de la precisión. La precisión hace referencia al número de cifras con las que se representa la mantisa: con 23 bits el número más grande que se puede representar es,

2²³ = 8.388.608

o cual quiere decir que se pueden representar todos los números decimales de 6 cifras y la mayor parte –aunque no todos– de los de 7 cifras (por ejemplo, el número 9.213.456 no se puede representar con 23 bits). Por eso se dice que las variables tipo float tienen entre 6 y 7 cifras decimales equivalentes de precisión.

float_grafic

Respecto al exponente de dos por el que hay que multiplicar la mantisa en base 2, con 7 bits el número más grande que se puede representar es 128. El rango vendrá definido por la potencia,

2¹²⁸ = 3.4028 · 10³⁸

 o cual indica el número más grande representable de esta forma. El número más pequeño en valor absoluto será del orden de,

2 ⁻¹²⁷ = 5.8775 · 10⁻³⁹

 Las variables tipo float se declaran de la forma:

FLOAT_REAL

Las variables tipo float pueden ser inicializadas en el momento de la declaración, de forma análoga a las variables tipo int.

 Variables reales (tipo double)

Las variables tipo float tienen un rango y –sobre todo– una precisión muy limitada, insuficiente para la mayor parte de los cálculos técnicos y científicos. Este problema se soluciona con el tipo double, que utiliza 8 bytes (64 bits) para almacenar una variable. Se utilizan 53 bits para la mantisa (1 para el signo y 52 para el valor) y 11 para el exponente (1 para el signo y 10 para el valor). La precisión es en este caso,

2⁵² = 4.503.599.627.370.496

lo cual representa entre 15 y 16 cifras decimales equivalentes. Con respecto al rango, con un exponente de 10 bits el número más grande que se puede representar será del orden de 2 elevado a 2 elevado a 10 (que es 1024):

floatmantisa

Las variables tipo double se declaran de forma análoga a las anteriores:

double_sintax

 Por último, existe la posibilidad de declarar una variable como long double, aunque el C++ no garantiza un rango y una precisión mayores que las de double. Eso depende del compilador y del tipo de computador. Estas variables se declaran en la forma:

long_double

 Enumeraciones

Crear una enumeración es definir un nuevo tipo de datos y declarar una variable de este tipo. La sintaxis es la siguiente:

enum1

enumeracion

El siguiente ejemplo vemos un ejemplo de enumeración:

enum_listado

 Cada identificador de la lista de constantes en una enumeración se corresponde con un valor entero, de tal forma que, por defecto, el primer identificador se corresponde con el valor 0, el siguiente con el 1, y así sucesivamente. No obstante, para C++ un tipo enumerado es un nuevo tipo entero diferente de los anteriores. Esto significa que en C++ un valor de tipo int no puede ser asignado directamente a una variable de un tipo enumerado, sino que hay que hacer una conversión explícita de tipo.

colores2

A cualquier identificador de la lista le podemos asignar un valor inicial entero por medio de una expresión constante. Los demás identificadores tomarán valores correspondientes a partir de este. Por ejemplo:

enum_color

En el ejemplo de arriba vemos un tipo enumerado llamado colores y declara una variable color de ese tipo. Los valores asociados a los identificadores son los siguientes:

azul = 0, amarillo = 1, rojo = 2, verde = 0, blanco = 1, negro = 2.

A estos enumeradores le aplicamos la siguiente regla:

  • Dos o más miembros de una enumeración pueden tener un mismo valor.
  • Un mismo identificador no puede aparecer en más de una enumeración.
  • Por desgracia, no es posible leer o escribir directamente un valor de un tipo enumerado.

Hemos visto en el listado el objeto cin. Este objeto le permite asignar un valor introducido por el teclado a la variable especificada.

listado_saludo

La salida sería:

 salida_saludocin_Clases

En lenguaje C++ es un lenguaje orientado a objetos. La base de la programación orientada a objetos es la clase. Una clase es un tipo de objetos definido por el usuario. Por ejemplo, la clase string de la biblioteca C++ está definido así:

c lass_string

Para definir el objeto para esta clase lo haríamos así:

string_sTexto

Suponiendo que la clase string tenga un operador de índices para el acceso público, [i], que devuelva el carácter que está en la posición i, la siguiente sentencia devolverá el carácter que está en la posición 1 (la ‘b‘):

string_char

Una característica muy importante que aporta la programación orientada a objetos es la herencia ya que permite la reutilización del código escrito por nosotros o por otros. Por ejemplo, el siguiente código define la clase ofstream como una clase derivada (que hereda) de ostream:

clase_ofstream

La clase ofstream incluirá los atributos y métodos heredados de ostream más los atributos y métodos que se hayan definido en esta clase. esto significa que un objeto de la clase ofstream podrá ser manipulado por los métodos heredados y por los propios.

atras2

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s