sábado, 1 de noviembre de 2014

Tipos de Datos en C


En C hay dos clases de tipos de datos:
1)Tipos de Datos Básicos.
Hay varios tipos básicos de datos. Los ficheros de cabeceras limits.h y float.h especifican los valores máximos y mínimos para cada tipo. Se pueden clasificar en:
Tipos Enteros:
charshortintlong y enum.
Tipos Reales:
floatdouble y long double
Otros:
void
El tipo booleano no existe, para representarlo se utilizan los enteros, asignándole 0 a falso y cualquier otro valor a verdadero.
(a)El Tipo Entero
Cada tipo int pude ser calificado por las palabras claves signed o unsigned, lo que da lugar a tener disponibles los siguientes tipos extras:
signed char, unsigned char
signed short, unsigned short
signed int, unsigned int
signed long, unsigned long
Un entero calificado signed es un entero con signo, esto es, un número entero positivo o negativo. Un número entero calificado unsigned es un número entero sin signo, el cual es manipulado como un número entero positivo. Si los calificadores signed y unsigned se utilizan sin un tipo específico, se asume el tipo int. Por este motivo son equivalentes son:
signed x; y signed int x;
unsigned x; y unsigned int x;
Tipo char
El tipo char se define generalmente en unidades de memoria de 1 byte (8 bits), que resultan más que suficiente para trabajar con el código ASCII estándar. El tipo char es utilizado para almacenar un valor entero en el rango -128 a 127, correspondiente a un carácter del código ASCII. Solamente los valores 0 a 127 son equivalentes a un carácter. De forma similar el tipo unsigned char puede almacenar valores en el rango de 0 a 255. Valores correspondientes a los números ordinales de los 256 caracteres ASCII.
Ejemplo:
char letra; /* Declara una variable de tipo char*/
letra = A; /* Asigna el valor A a la variable letra */
letra = 65; /* Código correspondiente al caracter Á'*/
letra = A; /* Error. Piensa que A es una variable */
letra = "A "; /* Error. Piensa que "A " es una tira de caracteres */
Tipo int
El tipo int puede calificarse con los adjetivos:
int = 2 bytes. Su rango es de -32768 a + 32767.
unsigned int = Los enteros sin signo van de 0 a 65535.
short int = 2 bytes. Rango es de -32768 a 32767.
unsigned short = Rango es de 0 a 65535.
long int = 4 bytes. Rango es de -2147483648 a 2147483647.
unsigned long = Rango es de 0 a 4294967295.
Tipo enum
Crear una enumeración es definir un nuevo tipo de dato, denominado tipo enumerado y declarar una variable de este tipo. La sintaxis es la siguiente:
enum tipo_enumerado
{
definición de nombres de constantes enteras
};
tipo_enumerado es un identificador que nombra al número tipo definido. Después de definir un tipo enumerado, se puede declarar una o más variables de ese tipo, de la forma: enum tipo_enumerado [variable[, variable]...];
Ejemplo:
enum colores;
{
azul, amarillo, rojo, verde, blanco, negro;
};
enum colores color;
Este ejemplo declara una variable color del tipo enumerado colores, la cual puede tomar cualquier valor de los especificados en la lista. Por ejemplo: color = azul;
Cada identificador, de la lista de constantes enteras en una enumeración, tiene un valor. Por defecto, el primer identificador tiene asociado el valor 0, el siguiente es el valor 1, y así sucesivamente. color= verde; es equivalente a color = 3. A cualquier identificador de la lista, se le puede asignar un valor inicial por medio de una expresión constante. Los identificadores sucesivos tomarán valores correlativos a partir de éste. Por ejemplo:
enum colores
{ azul, amarillo, rojo, verde = 0, blanco, negro
} color;
Este ejemplo define un tipo enumerado llamado colores y declara una variable color de ese tipo. Los valores asociados a los identificadores son los siguientes:
azul = 0amarillo = 1rojo = 2verde = 0blanco = 1 y negro = 2.
A los miembros de una enumeración se les aplica las siguientes reglas:

  • Dos o más miembros pueden tener un mismo valor.
  • Un identificador no puede tener más de un tipo.
  • Desafortunadamente, no es posible leer o escribir directamente un valor de un tipo enumerado.

  • (b)Tipo Real
    Las variables de tipo real son diferentes de las variables de tipo entero ya que se almacenan en memoria divididas en dos partes, en lugar de una. Las dos partes son:
    mantisa : la mantisa es el valor del número.
    exponente : la potencia a la que está elevado el número real en cuestión.
    Tipo float
    El tipo float necesita 4 bytes para ser almacenado: uno para el exponente y tres para el valor del número. Un real en simple precisión es un número que puede tener un punto decimal y que puede estar comprendido en el rango de:
    -3.402823E+38 a -1.175494E-38 para números negativos.
    1.175494E-38 a 3.402823E+38 para números positivos.
    Un número real en simple precisión no tiene más de 7 dígitos significativos.
    Ejemplo:
    float a = 3.14159;
    Tipo double
    El tipo double utiliza 32 bytes para almacenar un número en punto flotante. De ellos, se usan 8 bits para expresar el valor del exponente y su signo, y 24 bits para representar la parte no exponencial.
    Un real en doble precisión es un número que puede tener un punto decimal y que puede estar comprendido en el rango de:
    -1.79769E+308 a -2.22507E-308 para números negativos
    2.22507E-308 a 1.79769E+308 para números positivos
    Un número real en double precisión tiene hasta 16 dígitos significativos. Esto da lugar a cálculos más exactos que en simple precisión.
    Ejemplo:
    double a = 3.1415926;
    Tipo long double
    El tipo long double utiliza 10 bytes para almacenar un número en punto flotante.
    Los valores para este tipo están comprendidos en el rango de:
    -1.189731E+4932 a -3.362103E-4932 para números negativos
    3.362103E-4932 a 1.189731E+4932 para números positivos
    Un número real en double precisión formato largo no tiene más 19 dígitos significativos. Esto da lugar a cálculos más exactos que en double precisión.
    Ejemplo:
    double a = 3.17e+425;
    (c)Tipo void
    El tipo void se utiliza para declarar funciones que no retornan un valor o para declarar un puntero a un tipo no especificado. Si void aparece entre paréntesis a continuación del nombre de una función, no es interpretado como un tipo. En este caso indica que la función no acepta argumentos.
    Ejemplo:
    double fx(void);
    void fy(void);
    *p;
    Este ejemplo declara la función denominada fx como una función sin argumentos que devuelve un valor de tipo real de doble precisión; la funciónfy, como una función sin argumentos que no devuelve valor alguno; y un puntero p a un objeto de un tipo no especificado.
    2)Tipo de Datos Compuestos
    Este apartado describe los mecanismos de formación de tipos de datos más complejos: vectoresregistros (struct)registros variantes (union) y punteros.
    (a)Vectores
    Los vectores son conjuntos de elementos del mismo tipo. En C, todos los vectores empiezan en el elemento 0. La declaración:
    int vt[MAX_PROCESS];
    Declara un vector, vt, de enteros, con MAX_PROCESS (constante) posiciones. A estas posiciones se hace referencia como vt[0] avt[MAX_PROCESS-1]. Existen vectores de dos, tres y más dimensiones. Además pueden ser de cualquier tipo.
    (b)Registros
    Los registros son conjuntos de variables, generalmente de tipos diferentes. La declaración:
    typedef struct
    {
    char hostname[LONG_HOST];
    int port;
    } type_address;
    Declara a type_address como un registro con dos campos, el vector de caracteres hostname y el entero port.
    Para asignar el valor 1001 al campo port, se indica:
    type_address.port = 1001;
    Donde el operador "." indica que se ha seleccionado un miembro del registro.
    (c)Registros Variantes (unión)
    Los registros variantes están formados también por varios miembros, pero sólo pueden contener el valor de uno de ellos en cada momento. La declaración:
    union type_mess
    {
    int m3;
    int m4[MAX_PROCESS];
    };
    Indica que type_mess puede contener un entero o un vector de enteros, pero no ambos. Los compiladores deben reservar espacio suficiente para que los registros variantes puedan contener la variante que ocupe más espacio en memoria.
    (d)Punteros
    En C, los punteros se utilizan para almacenar direcciones de máquina. Su uso es muy frecuente. La declaración:
    int i, *pi, a[10], *b[10], **ppi;
    Declara un entero i; un puntero a un entero, pi; un vector de 10 elementos, a; un vector de 10 punteros a enteros, b; y un puntero a un puntero a un entero, ppi. Las reglas exactas de sintaxis de declaraciones complejas que combinen vectores, punteros y otros tipos son bastante complicadas.
    Por ejemplo, la declaración:
    typedef struct ptr_group
    {
    int group;
    int components;
    int view;
    struct ptr_group *p_group;
    ptr_process *p_process;
    } ptr_group;
    Las siguientes expresiones: ptr_group *p;ptr_group g; declaran que p es un puntero a un registro de tipo ptr_group, y que g es un registro de ese tipo. Para hacer que p apunte a g, se haría: p = & g; donde el símbolo "\&" representa el operador unario que hace referencia a la dirección de la variable que le sigue. Para copiar la variable entera group_num, el valor del miembro group, se escribe:
    group_num = p-group;
    Nótese el empleo de la flecha para acceder a los miembros de un registro por medio de un puntero. Una forma equivalente es la siguiente:
    group_num = *(p.group);
    Donde "*" es el operador unario de indirección, mediante el cual se accede al contenido de la dirección que se pone a continuación.
    Conversión de Tipos.
    En C se pueden realizar variadas conversiones entre tipos. En muchas ocasiones es necesario forzar explícitamente el tipo resultante de la conversión. Esto puede conseguirse especificando el tipo deseado entre paréntesis delante de la expresión que se ha de convertir, por ejemplo:
    marshall_long(packet, (long)i);
    Convertiría el entero i a tipo long antes de pasarlo como parámetro al procedimiento marshall_long, que esperará a su entrada una variable de tipo long.
    Sentencias de Control.
    En C los procedimientos contienen declaraciones e instrucciones. Ya hemos examinado las declaraciones, así que es el momento de centrar la atención en las instrucciones. Las instrucciones ifwhile y las de asignación son igual de importantes que las de otros lenguajes.Lo único que vale la pena destacar es que se utilizan llaves para agrupar instrucciones compuestas, y que la instrucción while tiene dos formas, la normal, y eldo while, equivalente al repeat de Pascal.
    1)Sentencia if
    Toma una decisión referente a la acción a ejecutar en un programa, basándose en el resultado (verdadero o falso) de una expresión.
    if (expresión)
    sentencia1;
    [ else
    sentencia2];
    expresión:debe ser una expresión numérica, relacional o lógica. El resultado que se obtiene al evaluar la expresión es verdadero (no cero) ofalso (cero).
    sentencia1/2: Representan una sentencia simple o compuesta. Cada sentencia simple debe estar separada de la anterior por un punto y coma.
    La ejecución de la sentencia if sucede así:

  • Si el resultado de la expresión es verdadero, se ejecutará lo indicado por la sentencia1.
  • Si el resultado de la expresión es falso, se ejecutará lo indicado por la sentencia2.
  • Si el resultado de la expresión es falso, y la cláusula else se ha omitido, la sentencia1 se ignora.

  • 2)Sentencia while
    Ejecuta una sentencia, simple o compuesta, cero o más veces, dependiendo del valor de una expresión.
    while (expresión)
    sentencia;
    Expresión: es cualquier expresión numérica, relacional o lógica.
    Sentencia: es una sentencia simple o compuesta.
    La ejecución de la sentencia while sucede así:

  • Se evalúa la expresión.
  • Si el resultado de la expresión es cero (falso), la sentencia no se ejecuta y se pasa a ejecutar la siguiente sentencia en el programa.
  • Si el resultado de la expresión es distinto de cero (verdadero), se ejecuta la sentencia y el proceso se repite comenzando en el punto 1.

  • 3)Sentencia do-while
    Ejecuta una sentencia, simple o compuesta, una o más veces, dependiendo del valor de una expresión.
    do
    sentencia;
    while (expresión);
    Expresión: es cualquier expresión numérica, relacional o lógica.
    Sentencia: es una sentencia simple o compuesta.
    La ejecución de la sentencia do-while sucede de la siguiente forma:

  • Se ejecuta la sentencia o cuerpo de la sentencia do.
  • Se evalúa la expresión.
  • Si el resultado de la expresión es cero (falso), se pasa a ejecutar la siguiente sentencia en el programa.
  • Si el resultado de la expresión es distinto de cero (verdadero), el proceso se repite comenzando en el punto 1.

  • 4)Sentencia for
    Cuando se desea ejecutar una sentencia simple o compuesta, repetidamente un número de veces conocido, la construcción adecuada es la sentencia for. Su forma es la siguiente:
    for (inicializador; condición; progresión)
    sentencia;
    Inicializador: representa la variable o las variables que serán inicializadas a un valor determinado.
    Condición: es una expresión Boole (operados unidos por operadores relacionales y/o lógicos). Si se omite, se supone siempre que es verdadera.
    Progresión: es una expresión cuyo valor evoluciona en el sentido de que se dé la condición para finalizar la ejecución de la sentencia for.
    Sentencia: es una sentencia simple o compuesta.
    La ejecución de la sentencia for sucede de la siguiente forma:

  • Se inicializan la o las variables de inicialización.
  • Se evalúa la condición.
  • Si el resultado es distinto de cero (verdadero), se ejecuta la sentencia, se evalúa la expresión que da lugar a la progresión de la condición y se vuelve al punto 2.
  • Si el resultado de 2 es cero (falso), la ejecución de la sentencia for se da por finalizada y se continúa en la siguiente sentencia del programa.

  • 5)Sentencia switch
    La sentencia switch permite ejecutar una de varias acciones, en función del valor de una expresión.
    La ejecución de la sentencia switch sucede de la siguiente forma:

  • La sentencia switch evalúa la expresión entre paréntesis y compara su valor con las constantes de cada case.
  • La ejecución de las sentencias del cuerpo de la sentencia switch, comienza en el case cuya constante coincida con el valor de la expr-test y continúa hasta el final del cuerpo o hasta una sentencia que transfiera el control fuera del cuerpo (por ejemplo break).
  • Si no existe un valor igual al valor de la expr-test, entonces se ejecutan las sentencias a continuación de default, si esta cláusula ha sido especificada. La cláusula puede colocarse en cualquier parte del cuerpo y no necesariamente al final.

  • 6)Sentencia break
    La sentencia break finaliza la ejecución de una sentencia doforswitch, o while en la cual aparece. Cuando estas sentencias están anidadas, la sentencia break solamente finaliza la ejecución de la sentencia donde está incluida.
    Expresiones.
    1)Expresiones Numéricas
    Las expresiones son secuencias de operandos y operadores. Los operadores más comunes son:

    Operador
    Función
    ( )
    llamada a función
    [ ]
    Subíndice de un arreglo
    .
    Punto . acceso a miembro de una estructura.
    ->
    Flecha. Apunta a miembro " " "
    !
    Inversor Lógico
    -
    Resta
    --
    Decrementar en uno
    ++
    Incrementar en uno
    &
    Obtener la dirección de memoria
    *
    Obtiene la indirección (contenido de)
    /
    División
    %
    modulo (resto de la división)
    +
    suma
    <
    menor que
    >
    mayor que
    <=
    menor igual
    >=
    mayor igual
    ==
    igualdad de comparación
    !=
    desigualdad
    &&
    operador lógico AND
    ||
    operador lógico OR
    ?:
    condicional evalúa dos expresiones
    =
    asignación simple
    ,
    separador de variables, constantes y expresiones dentro de funciones, estructuras de control, etc.
    sizeof
    Determina el tamaño de una variable o una estructura.
    Operadores de Asignación:

    Operador
    Significado
    *=
    multiplicado por
    /=
    dividido por
    %=
    modulo de
    +=
    añadir a
    -=
    sustraer desde
    2)Expresiones Condicionales
    C Tiene un operador ternario (?:), que se utiliza en expresiones condicionales, las cuales tienen la forma: operando 1 ? operando2 : operando3
    La expresión operando1 debe ser de tipo entero, real o puntero. La evaluación se realiza de la siguiente forma:

    • Si el resultado de la evaluación de operando1 es distinta de 0, el resultado de la expresión condicional es operando2.
    • Si el resultado de la evaluación de operando1 es 0, el resultado de la expresión condicional es operando3.

    No hay comentarios:

    Publicar un comentario