A los cinco tipos de datos básicos definidos por C89, C99 añade tres
más: _bool, _complex e _imaginary.
El formato exacto de los valores reales dependerá de cómo se hayan
implementado. Los valores del tipo char se usan normalmente para
guardar valores definidos en el juego de caracteres ASCII. Los valores
que estén fuera de ese intervalo pueden ser manejados de forma
diferente por por los distintos compiladores.
El intervalo de los tipos float y double dependerá del método
utilizado para representar los números reales en punto flotante. El
estándar de C especifica que el mínimo intervalo para un valor real
en punto flotante es de 1E-37 a 1E+37.
El tipo void, o bien declara explícitamente una función como que no
devuelve valor alguno, o crea punteros genéricos.
A excepción del tipo void, los tipos de datos básicos pueden tener
distintos modificadores precediéndolos. Un modificador se usa para
alterar el significado del tipo base de forma que se ajusta más
precisamente a las necesidades de cada momento.
Los siguientes son los modificadores:
signed
unsigned
long
short
El tipo int se puede modificar con signed, short, long y unsigned, el
tipo char se puede modificar con unsigned y signed. El modificador long
también se puede aplicar a double.
En el estándar C99 se permite que long modifique a long, creando así
un long long.
La diferencia entre enteros con y sin signo esta en cómo se interpreta
el bit más significativo del entero. Si se especifica un entero con
signo, el compilador genera código que asume que el bit más
significativo va a ser usado como un indicador de signo. Si el
indicador de signo es 0, entonces el número es positivo, si es 1,
entonces el número es negativo.
En general, los números negativos se representan utilizando el método
de complemento a dos, que invierte todos los bits del número (excepto
el indicador de signo), suma 1 y pone el indicador de signo a 1.