Задать вопрос
Qubc
@Qubc
Ненавижу полисемию.

Почему утверждается, что int32_t имеет ширину точно 32 бита, если он является всего лишь псевдонимом int, который может быть больше 32 бит??

https://en.cppreference.com/w/cpp/language/types
https://en.cppreference.com/w/cpp/types/integer

Согласно стандарту, intимеет ширину в принципе не меньше 16 бит. В модели LLP64 - не меньше 32 бит.
int32_t это typedef int int32_t; Следовательно, int32_t под капотом всего лишь обычный int и обладает свойствами int.
Значит его ширина в LLP64 будет не меньше 32 бит, но может быть и больше!

Если здесь не ошибки в рассуждениях, почему утверждается, что int32_t имеет ширину точно 32 бита, если он является всего лишь псевдонимом int и значит может быть и больше 32 бит?
  • Вопрос задан
  • 336 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Смотрите документацию. Там действительно утверждается, что int32_t должен иметь размер ровно 32 бита ("exactly").

Где вы взяли, что int32_t - это псевдоним int?
Подозреваю, что там, где вы это видели, куча #ifdef и проверок архитектуры.
Возмножно, на вашей системе, где int итак имеет 32 бита так оно и есть. При компиляции на другую архитектуру внезапно может оказаться, что int32_t - нифига не псевдоним к int.
Ответ написан
@MarkusD Куратор тега C++
все время мелю чепуху :)
В рассуждениях есть ошибка.

Да, стандарт утверждает что тип int может иметь размер не меньше 16 бит.
Таблица имеет название "Minimum width", т.е. минимальный размер. Минимальный - это значит что int может иметь размер в 16 бит. А может иметь и 64 бита.

В большинстве случаев нам это и не важно. Наоборот даже, нам важна оптимальность, с которой вычисления переходят от операций на памяти к операциям на регистрах. Но есть целый (немалый такой) ряд задач, когда о размере значения нужно не просто думать, а точно его знать и гарантировать при сборке в любых условиях.
Запись в файл, передача по сети, коммуникации с устройствами в составе компьютера (звук, видео, геоданные, низкоуровневый ввод и вывод)... Все это требует соблюдения протоколов, а протоколы требуют строгого соблюдения размеров и выравнивания передаваемых значений.

Ошибка в рассуждениях заключается в том, что ты проводишь нить только от int32_t к int и дальше к стандарту. В то время как стандарт определяет и требования к типу int32_t тоже.
Тип int32_t всегда и для любой модели памяти выбирается таким образом чтобы гарантировать размер в 32 бита.

То что где-то int32_t является псевдонимом int - это не более чем временное совпадение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы