Единственная причина использовать uint8_t
вместо unsigned char
(помимо эстетических предпочтений), если вы хотите задокументировать, что ваша программа требует, чтобы char
был точно 8 битами. uint8_t
существует тогда и только тогда, когда CHAR_BIT==8
, в соответствии с требованиями стандарта C.
Остальные типы intX_t
и uintX_t
полезны в следующих ситуациях:
- чтение / запись на диск / сеть (но тогда вам также нужно использовать функции преобразования в порядковый номер)
- когда вы хотите, чтобы поведение без знака было с точной обрезкой (но это можно сделать более переносимо с помощью оператора
&
).
- когда вы управляете точным макетом структуры, потому что вам нужно убедиться, что нет заполнения (например, для
memcmp
или для целей хеширования).
С другой стороны, типы uint_least8_t
и т. Д. Полезны везде, где вы хотите избежать использования расточительно больших или медленных типов, но должны гарантировать, что вы можете хранить значения определенной величины. Например, хотя long long
составляет не менее 64 бит, на некоторых машинах он может быть 128-битным, и использование его, когда вам нужен только тип, который может хранить 64-битные числа, будет очень расточительным на таких машинах. int_least64_t
решает проблему.
Я бы не стал использовать типы [u]int_fastX_t
полностью, поскольку они иногда меняли на данном компьютере (нарушая ABI) и поскольку определения обычно неверны. Например, в x86_64 64-разрядный целочисленный тип считается «быстрым» для 16-, 32- и 64-разрядных значений, но при этом сложение, вычитание и умножение имеют одинаковую скорость, независимо от того, используете ли вы 32- битовые или 64-битные значения, деление почти наверняка медленнее с типами, размер которых больше необходимого, и даже если они имеют одинаковую скорость, вы используете вдвое больше памяти, но это бесполезно.
Наконец, обратите внимание, что аргументы, которые некоторые ответы приводят о неэффективности использования int32_t
для счетчика, когда он не является собственным целочисленным размером, технически в основном корректны, но не имеют значения для исправления кода. Если вы не подсчитываете какое-то небольшое количество вещей, где максимальный счет находится под вашим контролем, или какое-то внешнее (не в памяти вашей программы), где счет может быть астрономическим, правильный тип для счетчика почти всегда равен size_t
. Вот почему все стандартные функции C используют size_t
для подсчета. Не думайте использовать что-либо еще, если у вас нет веских причин.