Дабы самому получше уложить в голове типы данных, не являющихся базовыми, попробую кратко систематизировать информацию о них в этом посте.

Целочисленные типы фиксированного размера

В C99 к списку файлов стандартной библиотеки C, среди прочих добавился заголовочный файл <stdint.h>, в котором определены многие целочисленные типы, которые ранее были определены в разных  файлах:

int(N)_t, uint(N)_t — типы, всегда занимающие N бит, независимо от платформы; int_least(N)_tuint_least(N)_t — типы, занимающие минимум N бит; int_fast(N)_tuint_fast(N)_t — аналогичны предыдущим, но имеют самую быструю реализацию для данной машины; intmax_tuintmax_t — типы, имеющие максимально возможный размер (используются, например, для вывода через printf переменных неизвестной длины, используя модификатор j)

N может может принимать значения 8, 16, 32 или 64 (например int_least16_t). Приставка u указывает на то, что тип является беззнаковым.

Булевы типы

C99 добавил поддержку булева типа _Bool.  Также в новом заголовочном файле <stdbool.h> определен более удобный псевдоним bool для этого типа и макросы true и false. Тип _Bool  является обычным целочисленным типом, с той разницей, что любое присвоенное ему значение, отличное от нуля сохраняется как 1. Кстати, он имеет такое странное название для обеспечения обратной совместимости, так как во многих уже существующих программах был определен свой тип bool.

Типы используемые для адресной арифметики

В эти типы можно записать максимальный индекс самых больших массивов. А также размер указателей и массивов любого типа, который может быть выделен на данной архитектуре. Их использование имеет смысл, так как в настоящее время размер int не всегда равен размеру машинного слова. Поэтому для обеспечения переносимости и надежности лучше использовать представленные ниже типы в местах, где предполагается их использование.

size_t — беззнаковый целочисленный тип. Широко применяется в стандартной библиотеке для указания размеров в байтах, счетчиков циклов, индексации массивов и адресной арифметики.  Определен в <stddef.h>. uintptr_t — аналог size_t. Предполагается использование для безопасного хранения указателей, на что намекает их название. ptrdiff_t — знаковый целочисленный тип. Является типом результата выражения, где один указатель вычитается из другого (ptr1 - ptr2). intptr_t — аналог ptrdiff_t, но опять же имеет более подходящее название для хранения указателей.

Математические типы

В C99 в файле <complex.h>  добавлены новые типы для поддержки комплексных чисел float _Complex, double _Complex, long double _Complex.

В файле  <math.h> добавлены типы float_t и double_t. Они имеют различные размеры в зависимости от установленного значения константы FLT_EVAL_METHOD. При значении 0 они эквивалентны типам float и double, при значении 1 — double, а при значении 2  — long double.

И с новым файлом <fenv.h> пришли новые типы fenv_t и fexcept_t. Первый представляет окружение для работы с числами с плавающей точкой, а второй коллекцию флагов этого окружения.

Другие типы местечкового применения

Также стандартная библиотека определяет еще довольно много типов, таких как: fpos_t, использующийся для определения позиции каждого байта при чтении/записи, va_list — для передачи переменного числа аргументов в функцию, wchar_t — для представления “широких символов”. Описание всех их может раздуть пост до размеров книги. Да и нет смысла описывать их скопом. Возвращаться к ним лучше при рассмотрении конкретной темы, связанной с областью их применения.