El lenguaje C maneja datos tanto numéricos (enteros y reales) como de tipo carácter. En este último caso hay que diferenciar entre los caracteres tratados de manera individual, y las cadenas de estos. En la siguiente tabla podemos ver un ejemplo de lo expuesto (las comillas que aparecen en los tipo carácter y cadenas son necesarias al usar este tipo de datos en C).
Enteros |
19 -152 |
Reales |
1.4 -156.2 19.13e+12 |
Carácter |
`a` `3` `\n` |
Cadenas |
"Hola Mundo" "Adiós\n" |
Los tipos de datos básicos en el lenaguaje C son:
Con signo (complemento a 2) |
char |
short |
int |
long |
Sin signo (binario natural) |
unsigned char |
unsigned short |
unsigned int |
unsigned long |
El tipo char de usa para almacenar caracteres en código ASCII.
El tamaño de cada tipo de dato es dependiente de la máquina. Es importante conocerlo para saber el rango de cantidades que nos permite representar cada uno de ellos.
Tipos |
float |
double |
Tamaño (bytes) |
4 |
8 |
Tipos |
[unsigned] long long (cantidades enteras) |
long double (cantidades reales) |
Tamaño (bytes) |
Dependiente de máquina |
12 |
En el lenguaje C todas las variables han de ser declaradas antes de ser usadas. La sintaxis que se sigue es:
tipo nombre_variable [,nombre_variable...];
A la hora de identificar a una variable (darle nombre) hay que tener en cuenta las siguientes reglas muy simples:
En la declaración se puede inicializar (darle valor inicial) a una variable de la siguiente manera:
tipo nombre_variable=valor [,nombre_variable...];
Cuando en una expresión aritmética se mezclan variables de distintos tipos, el compilador de C realiza una conversión implícita al tipo de mayor longitud/rango, siguiendo la siguiente jerarquía:
char < unsigned char < short < unsigned short < int < unsigned int < long < unsigned long < float < double.
Por ejemplo si multiplicamos un entero por un real, el compilador realizará una conversión de tipo entero a real, y la multiplicación se realizará entre dos cantidades reales. Lo mismo ocurre si el resultado de una expresión es de un tipo, y la asignación ser realiza a una variable de tipo distinto. Sin embargo, el resultado de estas conversiones implícitas no siempre es el deseado, por eso es aconsejable que sea el propio programador el que realice, en casos como los comentados, la conversión de manera explícita. Para esto existe el operador de cambio de tipo. La sintaxis es la siguiente:
(nuevo_tipo) expresión/variable.
Ejemplo:
Ejemplo_Var_1. Uso de variables. Mediante un editor escribe el siguiente código, compílale y ejecútale
/* Primera aproximación al uso de variables */
#include <stdio.h>
int main( void )
{
/* Ejemplo de declaración de variable sin asignación */
int a, b, UnEntero1;
char c;
unsigned long x;
float f;
/* Declaración y asignación */
int d=-52;
unsigned char UnaLetra=a;
double Grande=-141.255e+7;
/* Ejemplo de asignación de valor a variables */
a=23;
c=s;
f=3.78;
printf ("valor asignado a la variable a: %d a c: %c a f: %f y a Grande: %lf\n", a, c, f, Grande);
printf ("Valor en decimal de la variable UnaLetra: %d. Valor interpretada como carácter: %c\n", UnaLetra, UnaLetra);
/* Ejemplo de asignación en otros sistemas de numeración */
a=0x050; /* Constante en hexadecimal */
b=0311; /* Constante en octal */
printf ("Valor de a en hexadecimal: %x y en decimal: %d. Valor de b en octal: %o y en decimal: %d\n", a, a, b, b);
return 0;
}
Responde a las siguientes preguntas:
Ejemplo_Var_2. Al compilar el siguiente programa dará error. Contiene otro error típico en programas C. Buscar y corregir el error.
/* Programa con error */
#include <stdio.h>
int main( void )
{
/* Ejemplo de declaración de variable sin asignación */
int a, b, UnEntero1;
Char c;
unsigned long x;
float f;
a=23;
c=s;
f=3.78;
printf ("valor asignado a la variable a: %d a c: %c a f: %f y a Grande: %lf\n", a, c, f, Grande);
return 0;
}
Ejemplo_Var_3. El siguiente programa sirve para ver el problema que puede surgir si se deja la conversión de tipo al compilador:
/* Ejemplo de conversión implícita/explícita de tipo*/
#include <stdio.h>
int main( void )
{
int a=5, b=3;
float f1, f2;
f1 = a / b; /* el resultado del cociente es un entero, que es convertido a float en la asignación a f1 */
f2 = (float) a / (float) b; /* el cociente se realiza entre números reales */
printf("Resultado conversion implicita: %f Resultado conversion explicita: %f\n",f1, f2);
return 0;
}