Не только для переносимости между операционными системами, но и между архитектурами, например, между 32- и 64-разрядными машинами.
Представьте, что вы написали некоторый сетевой код на 32-разрядной машине, которая использовала два беззнаковых целых для хранения 64 последовательных битовых флагов. Скомпилируйте тот же код на 64-битной машине, и он практически гарантированно не будет работать, учитывая, что большинство 64-битных машин выделяют 8 байтов для целого числа, так что в итоге вы получили бы 128 битов и 32 бита между вашими два набора 32-битных флагов. Это, очевидно, очень плохо для мобильности.
На * nix машинах вы часто будете видеть typedef, которые конкретно указывают размер памяти, выделенной для этой переменной, например, uint16_t и uint32_t. Затем они typedef'd для любого типа, который дает вам столько неподписанного хранилища в конкретной архитектуре, поэтому ваш код может оставаться согласованным для всех операционных систем и архитектур.