Мне было интересно, в чем разница между int_least32_t и long, поскольку по стандарту long должен быть шириной не менее 32 бит, а int_least32_t, согласно стандарту, также должен быть шириной не менее 32 бит, поэтому эквивалентен по определению длинный. Это подводит меня к вопросу, в чем разница между ними (если мы рассматриваем случай реализации, которая также оснащена стандартной библиотекой C)?
Верно, но в целом [int]>=16, а [long]>=32 (что, следовательно, соответствует int_least32_t), но, конечно, это может быть и [int]==[long]==32, или, как и в моей системе, [int]==32, [long]==[long long]==64.
Если вы не работаете с встраиваемыми устройствами низкого уровня, ретро-вычислениями или другими эзотерическими платформами, int будет 32-битным.
int_least32_t
будет typedef для наименьшего целочисленного типа, способного хранить 32-битное значение.
long
— не менее 32 бит, но часто бывает 64 бита, в зависимости от платформы.
long
должен иметь ширину не менее 32 бит, но допускается и больше, даже если в архитектуре существует 32-битный тип.
int_least32_t
должен иметь ширину 32 бита, если такой тип существует в архитектуре, и может быть больше, только если это невозможно для данной архитектуры (и тогда должен быть следующий наименьший доступный размер).
Полезная цитата:
Имя typedef
int_leastN_t
обозначает целочисленный тип со знаком шириной не менее N, так что ни один целочисленный тип со знаком меньшего размера не имеет ширины хотя бы указанной. Таким образом,int_least32_t
обозначает целочисленный тип со знаком шириной не менее 32 бит.
C2x § 7.22.1.2 1
int_least32_t
— самый узкий, но как минимум 32-битный. Поскольку CHAR_BIT == 8
встречается очень часто, это означает, что int_least32_t
32-битный — возможно, того же ранга, что и long
или даже int
. int_least32_t
действительно полезен только для кода с высокой переносимостью, который может работать с редкими платформами CHAR_BIT == 9, 10, 12,... non-power-of-2
или где CHAR_BIT > 32
. В противном случае используйте ìnt32_t
.
long
имеет размер не менее 32 бит, так как LONG_MAX
имеет размер не менее 2 147 483 647, но может быть больше, например 64-битный. Оба случая в наши дни распространены.
int_least32_t
также полезен в таких установках, как старые Crays, где все типы данных являются 64-битными, и в отличие от int32_t
он гарантированно существует, поэтому, если вам не нужны ровно 32 бита для точного маскировки или чего-то подобного, возможно, int_least32_t
должно быть по умолчанию больше int32_t
для максимальная портативность (за счет раздражающего многословия).
@ShadowRanger Ответ обновлен.
Просто из любопытства, на какой (современной) платформе (следовательно, не на старых PDP, Crays и так далее, а на чем-то современном/активно используемом) используется CHAR_BIT != 8, а точнее, на какой (современной) платформе стоит CHAR_BIT не соответствует степени 2? И как тогда реализуется байт на такой платформе (кроме того, зачем вообще сейчас проектировать платформу, не имеющую CHAR_BIT, выровненного по степени 2?)?
@luksev Множество вопросов в вашем комментарии, достойном поста на каком-нибудь сайте обмена стеками. Рассмотрите возможность размещения сообщений там, поскольку они слишком глубоки для полноценного обмена комментариями. Обратите внимание, что в C байт не обязательно является 8-битным, даже если такая реализация редка или архаична. Я подозреваю, что некоторые графические процессоры могут (или могут) использовать CHAR_BIT == 64
. Они есть в прошлом.
Я ожидаю, что
int_least32_t
будет псевдонимом дляint
, а неlong
на современном оборудовании/ОС.