Я видел разные типы определения целого числа в stdint.h
, Я возьму 32-разрядное целое число без знака в качестве примера.
uint32_t
ясно обозначает беззнаковое целое число из 32 бит. Это тот, который я всегда использую.
uint_fast32_t
а также uint_least32_t
: Какая разница с uint32_t
и когда я должен использовать их вместо uint32_t
?
И вот, я увидел uintX_t
где X — 24, 40, 48 и 56. В моем коде случается, что мне приходится работать с 48- и 56-битными целыми числами. В качестве примера, я полагаю, uint24_t
это определить как что-то вроде этого:
struct uint24_t { unsigned int the_integer : 24; };
Я прав ? И, вы предлагаете мне использовать uint48_t
для моих 48-битных целых чисел без знака или я должен использовать нормальный uint64_t
?
Спасибо за ваши объяснения.
какая разница с uint32_t
uint_fast32_t
это тип без знака, по крайней мере, 32 бит, который (в некотором общем смысле) является самым быстрым таким типом. «быстрый» означает, что при наличии выбора разработчик, вероятно, выберет размер, для которого архитектура имеет арифметические инструкции, инструкции загрузки и сохранения. Это не победитель какого-либо конкретного теста.
uint_least32_t
наименьший тип без знака, по крайней мере, 32 бит.
uint32_t
является типом точно 32 бита без дополнения, если любой такой тип существует.
Я прав?
Если uint24_t
существует вообще, то это целочисленный тип, а не struct
, Если в этой реализации нет целочисленного типа без знака в 24 бита, то он не существует.
поскольку unsigned long
должно быть не менее 32 бит, единственные стандартные типы, которые uint24_t
может когда-нибудь быть псевдонимом для char
, unsigned char
, unsigned short
а также unsigned int
, В качестве альтернативы это может быть расширенный тип (то есть целочисленный тип, предоставляемый реализацией, который не является ни одним из определенных целочисленных типов в стандарте).
Вы предложите мне использовать uint48_t для моих 48-битных целых чисел без знака?
Если он существует и соответствует желаемому размеру, вы можете использовать его. Тем не менее, он не будет существовать в очень многих реализациях, поэтому он подходит только для использования в непереносимом коде. Это нормально, если причина, по которой вам приходится иметь дело с точными 48-битными целыми числами, зависит от платформы.
Точные 16, 32 и 64-битные типы также технически необязательны, но они должны существовать, если реализация имеет подходящие целочисленные типы. «Подходящий» означает не только то, что существует точный N-битный тип без знака без битов заполнения, но также и то, что соответствующий тип со знаком не имеет битов заполнения и использует представление дополнения 2. На практике это настолько близко ко всему, что вы очень мало ограничиваете переносимость, используя любой из них. Для максимальной мобильности, хотя вы должны использовать uint_least32_t
или же uint_fast32_t
в предпочтении uint32_t
, Какой из них зависит от того, заботитесь ли вы больше о скорости или размере. По моему опыту, мало кто беспокоится, так как платформы, которые не имеют 32-битного целочисленного типа, уже настолько странны, что большинству людей все равно, работает на них код или нет.
uint32_t
существует только в том случае, если платформа поддерживает беззнаковый целочисленный тип, который имеет ширину ровно 32 бита и не имеет заполнения.
uint32_least_t
всегда существует и является целым типом без знака, по крайней мере, с 32 битами, и это самый маленький такой тип.
uint32_fast_t
также всегда существует и является целочисленным типом, по крайней мере, с 32 битами, и это «наиболее естественный» тип для платформы, то есть тип, для которого операции генерируют наиболее эффективный код.
Примечание: подписанная версия, int32_t
, также требует представления знака дополнения 2.