Стандартная разница C между int_least32_t и long

Мне было интересно, в чем разница между int_least32_t и long, поскольку по стандарту long должен быть шириной не менее 32 бит, а int_least32_t, согласно стандарту, также должен быть шириной не менее 32 бит, поэтому эквивалентен по определению длинный. Это подводит меня к вопросу, в чем разница между ними (если мы рассматриваем случай реализации, которая также оснащена стандартной библиотекой C)?

Источники - https://en.wikipedia.org/wiki/C_data_types#Main_types , https://en.wikipedia.org/wiki/C_data_types#Fixed-width_integer_types.

Я ожидаю, что int_least32_t будет псевдонимом для int, а не long на современном оборудовании/ОС.

Shawn 27.07.2024 19:25

Верно, но в целом [int]>=16, а [long]>=32 (что, следовательно, соответствует int_least32_t), но, конечно, это может быть и [int]==[long]==32, или, как и в моей системе, [int]==32, [long]==[long long]==64.

luksev 28.07.2024 17:44

Если вы не работаете с встраиваемыми устройствами низкого уровня, ретро-вычислениями или другими эзотерическими платформами, int будет 32-битным.

Shawn 28.07.2024 22:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
79
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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 27.07.2024 20:25

@ShadowRanger Ответ обновлен.

chux - Reinstate Monica 27.07.2024 20:47

Просто из любопытства, на какой (современной) платформе (следовательно, не на старых PDP, Crays и так далее, а на чем-то современном/активно используемом) используется CHAR_BIT != 8, а точнее, на какой (современной) платформе стоит CHAR_BIT не соответствует степени 2? И как тогда реализуется байт на такой платформе (кроме того, зачем вообще сейчас проектировать платформу, не имеющую CHAR_BIT, выровненного по степени 2?)?

luksev 28.07.2024 17:47

@luksev Множество вопросов в вашем комментарии, достойном поста на каком-нибудь сайте обмена стеками. Рассмотрите возможность размещения сообщений там, поскольку они слишком глубоки для полноценного обмена комментариями. Обратите внимание, что в C байт не обязательно является 8-битным, даже если такая реализация редка или архаична. Я подозреваю, что некоторые графические процессоры могут (или могут) использовать CHAR_BIT == 64. Они есть в прошлом.

chux - Reinstate Monica 28.07.2024 22:41

Другие вопросы по теме