HISTORIA
En el lenguaje C estandarizado
como C89, existían cuatro tipos de datos básicos que son: los números enteros,
los números reales, los caracteres, y los punteros. A partir del estándar C99
se agregan: los valores lógicos (verdadero o falso) y los números complejos.
Estos tipos de datos son parte
del lenguaje, y por ello se los considera primitivos. Más adelante veremos que
con el uso de estructuras y uniones es posible crear tipos compuestos de datos
a partir de estos tipos primitivos.
En este capítulo veremos los
enteros, los reales y los caracteres. Más adelante se verán otros tipos de
datos más complejos, como son los vectores, las cadenas de caracteres, y los
punteros en general.
ENTEROS
Los enteros son el tipo de dato
más primitivo en C. Se usan para representar números enteros. Pero siempre se
pueden encontrar otras aplicaciones para los números enteros. En general se
pueden usar para representar cualquier variable discreta.
Los tipos de datos enteros son:
short, int, long y long long, cada uno representando un número entero de un
tamaño o capacidad determinado. Según el compilador y la plataforma de
hardware, cada uno de estos tipos de dato puede ocupar desde 1 byte hasta 8
bytes en memoria (para más detalles busca en la referencia).
Además, el lenguaje C hace la
distinción de si el entero es con signo (signed) o sin signo (unsigned). En
caso de que no se declare si es con signo o sin signo, se toma con signo.
Algunos ejemplos de declaraciones
de enteros:
int a;
unsigned int a;
signed
long a;
signed
long long a = 10000000;
Todos los números son
representados en memoria mediante una cadena de bits. En el caso de los números
con signo, el bit más significativo es el que se usa para representar el signo.
La representación de los números negativos se realiza mediante el complemento a
dos, que es una técnica que permite operar con los números negativos de forma
lógica.
A modo de ejemplo, la
representación en memoria del número -8 en una variable de 2 bytes, entera, con
signo, sería la siguiente:
1111111111111000
FLOTANTES
Se denomina flotantes a los tipos
de datos que representan a los números reales, ya que utilizan un sistema de
representación basado en la técnica de coma flotante, que permite operar con
números reales de diversas magnitudes, mediante un número decimal llamado
mantisa y un exponente que indica el orden de magnitud.
El tipo de dato flotante en
lenguaje C sólo tiene dos tamaños: el float y el double, que son 4 bytes y 8
bytes respectivamente. Se los puede utilizar tanto para representar números
decimales, como para representar números enteros con un orden de magnitud muy
grande.
La forma de declarar una variable
flotante es escribiendo en una línea uno de los tipos de datos flotantes y a
continuación el nombre de la variable y tal vez algún valor que se les quiera
dar.
Algunos ejemplos:
float a;
double a = 1e23;
double a = 3.1416;
float a
= 4e-9;
double
a = -78;
Hay que tener en cuenta que
aunque los valores flotantes son más convenientes para algunas aplicaciones,
hay casos en los que se prefieren los enteros. Esto se debe a que los números
flotantes no necesariamente tienen soporte de hardware, en particular en las
plataformas integradas. Una alternativa que se utiliza en estas situaciones es
interpretar los enteros como decimales de forma que 150 se interprete como 1.5
y 2345 como 23.45.
Para el caso de los flotantes de
4 bytes, se utiliza 1 bit para el signo, 8 bits para el exponente y 23 bits
para el valor del número. El procedimiento para almacenar un número en una
variable flotante es el siguiente:
Se convierte a binario la parte
entera.
Se coloca el signo en el bit más
significativo de la misma manera que en los enteros (1 para el - y 0 para el
+).
Se mueve la coma (en la
representación binaria de la parte entera) hasta que esté a la derecha del
primer uno y éste se descarta (el uno más significativo). El valor del
exponente será el número de posiciones que se movió la coma. El exponente usa
la representación de un entero con complemento a dos.
Se convierte en binario la parte
decimal del número. Esto usando el peso de los bits. el bit decimal más
significativo vale 1/2, el siguiente vale 1/4, el otro 1/8, el otro 1/16 y así
hasta completar lo que falta para los 23bits del valor.
Se concatena todo y ese es el
valor flotante representado en memoria.
CARACTERES
Los caracteres se representan
utilizando el tipo char, que tiene sólo 1 byte de tamaño. Este tipo se utiliza
para representar los 256 caracteres de la tabla de caracteres del sistema. El
tipo char es también un tipo entero, ya que puede tomar valores de 0 a 255. Por
lo tanto también puede ser signed o unsigned.
En cuanto a la forma de declarar
variables de tipo char es la misma forma que con los otros tipos.
char a;
char a
= 's';
unsigned char a = 48;
Como puedes ver, se le puede
asignar un número a una variable char, ya que se trata de un tipo entero. En
muchas situaciones se utiliza el tipo char para almacenar números pequeños, ya
que ocupa en memoria sólamente un byte.
Es importante notar que con la
llegada de la codificación UTF-8, los caracteres de los diversos idiomas pueden
ocupar 1, 2, 3 o 4 bytes, de modo que el tipo char ya no alcanza para la
representación de todos los caracteres posibles. Por ello, el estándar C99
introduce el tipo wchar que puede ocupar más de 1 byte, según sea necesario
para la codificación utilizada por el sistema.