Когда следует использовать типы данных из stdint.h? Правильно ли всегда использовать их в качестве конвенции? Какова была цель дизайна неспецифических типов размеров, таких как int и short?
Uint32_t vs int как соглашение для повседневного программирования
Ответ 1
Когда следует использовать типы данных из stdint.h?
- Когда задачи программирования задают ширину целого числа, особенно для размещения некоторого формата файла или протокола связи.
- Когда требуется высокая степень переносимости между платформами.
Правильно ли всегда использовать в качестве условного обозначения их (тогда)?
Вещи склоняются таким образом. Типы фиксированной ширины являются более поздним дополнением к C. Original C имеет char, short, int, long
, и это было прогрессивным, поскольку он пытался, не будучи слишком специфичным, для размещения различных целочисленных размеров, доступных в самых разных процессорах и средах. Поскольку C 40-летний возраст, он говорит об успешности этой стратегии. Много кода C было написано и успешно справляется с размером спецификации мягкого целочисленного размера. С ростом потребностей в согласованности char, short, int, long and long long
недостаточно (или, по крайней мере, не так просто), и поэтому int8_t, int16_t, int32_t, int64_t
рождаются. Новые языки, как правило, требуют особого фиксированного целочисленного размера и 2 дополнения. Поскольку они успешно, то дарвиновское давление будет надавливать на C. Мой хрустальный шар говорит, что мы увидим медленную миграцию на все более широкое использование типов фиксированной ширины в C.
Какова была цель дизайна неспецифических типов размеров, таких как int и short?
Это был хороший первый шаг для размещения широкого спектра различных целых ширин (8,9,12,18,36 и т.д.) и кодировок (2, 1, знак /mag ). Так много кодирования сегодня использует целые числа размера 2 из 2 с двумя дополнениями, что невозможно понять, что многие другие механизмы существовали заранее. См. Этот ответ.
Ответ 2
Моя работа требует, чтобы я использовал их, и я действительно люблю их использовать.
Я считаю это полезным, когда мне нужно реализовать протокол и использовать его внутри структуры, которая может быть сообщением, которое необходимо отправить, или владельцем определенной информации.
Если мне нужно использовать порядковый номер, который нужно увеличить, я бы не использовал int, потому что порядковые номера не должны быть отрицательными. Вместо этого я использую uint32_t. Поэтому я узнаю пространство порядкового номера и может соответствующим образом планировать/кодировать.
Код, который мы пишем, будет работать как на 32, так и на 64-битной машине, поэтому использование "int" на разных бит-машинах приводит к тонким ошибкам, которые могут быть болью для идентификации. Использование unint16_t будет выделять 16 бит в 32 или 64-битной архитектуре.
Ответ 3
Нет, я бы сказал, что никогда не рекомендуется использовать их для программирования общего назначения.
Если вы действительно заботитесь о количестве бит, тогда идите и используйте их, но для наиболее общего использования вам все равно, а затем используйте общие типы. Общие типы могут быть быстрее, и их, безусловно, легче читать и писать.
Ответ 4
Типы данных с фиксированной шириной должны использоваться только тогда, когда это действительно необходимо (например, при реализации протоколов передачи или доступа к аппаратным средствам или требующих определенного диапазона значений (здесь вы должны использовать вариант ..._least_...
)). Ваша программа не будет адаптироваться еще в измененных средах (например, использование uint32_t
для файлов может быть в порядке 10 лет назад, но off_t
будет соответствовать последним потребностям). Как указывали другие, может быть влияние производительности, поскольку int
может быть быстрее, чем uint32_t
на 16-разрядных платформах.
int
сам по себе очень проблематичен из-за его подписанности; лучше использовать, например, size_t
, когда переменная содержит результат strlen()
или sizeof()
.