Tipos de datos

En C tenemos 5 tipos básicos de datos, carácter (char), entero (int), coma flotante (float), coma flotante de doble precisión (double) y void. Los demás tipos se basan en uno de estos cinco.
C no tiene tipo boleano.

El tamaño y el rango son aproximados, varian de una máquina a otra, tomaremos esta tabla como referencia de los tipos.

void, literalmente vacío, se utiliza  para declarar una función que no devuelve valor alguno, o que no acepta parámetros o para definir un puntero genérico.

También tenemos tipos complejos, como las enumeraciones, enum, las estructuras, struct, las uniones, union o los tipos definidos por el usuario, typedef. Veremos todo esto un poco más adelante.

Podemos emular el tipo boleado con una enumeración:
enum Bolean {false, true} mybool;

Declaraciones:

Los tipos nos sirven para declarar variables.
Una variable es una posición de memoria que se usa para guardar un valor que puede modificarse durante la ejecución del programa. Todas las variables deben ser declaradas antes de usarlas, sino el compilador no sabrá que cantidad de memoria necesita para albergarla y producirá un error al compilar.

El siguiente código es un ejemplo con variables enteras.

Este fragmento de código declara dos variables enteras, dentro del cuerpo de la función main(), les asigna un valor a cada una y  muestra en pantalla, mediante la función printf() la suma de ambas. Por último retorna 0.
variable1 y variable2 son creadas dentro del cuerpo de la función main(). Decimos de estas variables que son locales a esta función.
Una variable declarada fuera del cuerpo de cualquier función, decimos que es una variable global.

El uso de la función printf( ) lo veremos más adelante, de momento  copiar el código tal y como está escrito, sin saltarse ni una coma.

Como se puede observar, para sumar dos variables, sólo es necesario utilizar el operador aritmético +.
A continuación compilamos el programa y lo ejecutamos.


El resultado de sumar variable1 mas variable2 es 1011, lógico.
En las líneas 4 y 5 se declaran estas variables y en las líneas 8 y 9 se les asigna un valor en este caso 10 y 1001.

Los operadores aritméticos, mejor dicho, los símbolos que utiliza C para hacer las operaciones aritméticas son:



Es aquí donde entra en juego, el tipo y el rango de las variables. si en vez de sumar, multiplicáramos las dos variables el resultado sería 10010. Estaríamos dentro del rango de tipo int. Pero que pasaría si nuestros valores fueran otros.
En mi caso, mi ordenador trabaja con los int con un rango de 4 byte (32 bits), por lo que no tendría ningún problema con valores de entre:
-2147483647 a 2147483647


El resultado de compilar este ejemplo no es el esperado.

Como se ve en la ejecución el resultado es negativo, no es el esperado, esto es por la representación interna de los valores. Se almacenan como bits de un tamaño concreto, en mi caso 4 bytes (32 bits) y se ajustan al rango.

Otro ejemplo:
#include <stdio.h>

int main(int argc, char* argv[]) {

char a, b, c, i = 1;
a = 200;
b = 60;
printf("\n%lu bytes\n",sizeof(unsigned char)*8);
printf("Valores asignados a =200, b = 60\n");
printf("\nValor de a guardado: %d",a);
printf("\nValor de b guardado: %d",b);
c = a+b;
printf("\nSuma a + b = %d",c);

return 0;
}

En este caso la suma de a + b es 4;
Esto es debido a que a la variable a no se le asigna 200, si no -56.


ALCANCE/VISIBILIDAD

En este código vemos que se ha declarado una variable area_circulo del tipo float al comienzo del archivo, esta variable es accesible desde cualquier parte de este archivo, siendo visible para cualquier función que la necesite, dentro del archivo.

Dentro del cuerpo de main hemos declarado una variable llamada radio que se inicializa a valor 3 y que es utilizada para calcular el valor del área en la línea siguiente del código. Se imprime el valor de área_circulo mediante la función printf y a continuación se llama a la función areaCirc() con un parámetro entero de valor 5. Dentro de areaCirc  se declara una variable radio y se le asigna el valor pasado como parámetro, termina la función y devuelve el control a main que ejecuta la siguiente sentencia que es
area_ciculo = PI * radio * radio;

y vuelve a imprimir el valor de area_circulo.

Leyendo el código podríamos pensar que areaCirc modifica el valor de radio por lo que el segundo printf mostraría el área de un círculo de radio 5. Sin embargo esto no pasa.

La variable radio declarada dentro de areaCirc() es local a esta función  y sólo existe dentro de ella. Lo mismo pasa con la variable radio declarada dentro de main(), solo es accesible dentro de la función main, por lo que no es accesible desde la función areaCirc()

El resultado de ejecutar este código sería:

La variable radio declarada dentro de main no se ha visto modificada por la función areaCirc()

Durabilidad.

La durabilidad es el tiempo de ejecución del programa donde el objeto existe en la memoria.

Tipos:

  • Estática.
    • El objeto perdura desde la compilación hasta el final. Esta durabilidad la tienen todas las funciones declaradas, las variables no declaradas en ningún cuerpo de función y las variables declaradas como static.
  • Local.
    • El objeto es creado en la entrada de un bloque y es borrado a la salida. Esta durabilidad la tienen los argumentos formales  y las variables declaradas con auto. Es la declaración por defecto, la variables declaradas en un bloque son variables locales.
  • Externa.
    • Los objetos especificados tienen durabilidad static e informa al enlazador de programas para que realice las unificaciones pertinentes entre ficheros. Convierte su alcance al total de programa. La declaración del mismo objeto en otros ficheros se toma como referencia y debe tener obligatoriamente el especificado extern. Si se pone un valor de inicialización, se debe inicial izar en la declaración de la variable que no lleva  extern.
  • Registro.
    • Se puede utilizar para variables locales y argumentos de funciones. Establece una durabilidad local pero informa de un uso intensivo de memoria, haciendo que el compilador le asocie un acceso de memoria rápido. register.

El siguiente vídeo  nos habla de las variables y las constantes, gracias a Victor P.C. (TuTeam)