гарантировано ли стандартом, что это правда?
Например, если, например, я использую окна, int
и long
имеют одинаковый размер, будет ли гарантировано, что если int32_t
является, например, псевдонимом signed int
, то гарантированно, что uint32_t
является псевдонимом unsigned int
, а не unsigned long
.
Мне нужно это, чтобы избежать UB при совмещении типов.
В стандарте говорится, что он должен предоставлять эти определения типов только в том случае, если существуют целочисленные типы надлежащего размера. Но любой компилятор, который смешивает long
с unsigned int
, не будет таким уж популярным. Я думаю, ноль пользователей!
static_assert(typeid(int) == typeid(std::int32_t));
@Элджей, ты, кажется, не понял мой вопрос, перечитай его еще раз.
@Eljay, еще правильный способ проверить это static_assert<std::is_same_v<std::make_signed_t<uintXX_t>,intXX_t>
@user - Может быть, вместо этого вам следует спросить о предполагаемом псевдониме типа? Это звучит очень опасно! И это близко к проблеме XY
Кроме того, в отличие от старых определений типов C, std::make_signed
указывается для предоставления «соответствующего типа». Не просто тип с одинаковым количеством бит.
@BoP У меня есть сокет, у меня есть перегрузки для каждого целочисленного типа, но у него много дубликатов, и я хотел реализовать знаковые элементы беззнакового с помощью reinterpret_cast, который безопасно использовать для преобразования из знакового T в беззнаковый T это не влияет на битовый партнер, который является importsnt
Я не думаю, что стандарт ничего говорит по этому поводу. Каждая реализация, которую я видел, обладает свойством, которое вы ищете, и я не понимаю, почему кто-то может сделать это по-другому, но стандарт не дает никаких гарантий. Тем не менее, использование std::make_signed
/std::make_unsigned
, как предлагали другие, позволяет избежать всей этой путаницы, если вы просто хотите выполнить reinterpret_cast
, и они хорошо работают даже с шаблонными типами.
uintXX_t
всегда должен быть беззнаковой версией intXX_t
с тем же числом битов (XX
бит). Пожалуйста, объясните, какую проблему вы пытаетесь решить, и где то, что я написал в первом предложении, недостаточно хорошо.
@wohlstad, где твое доказательство и прочитай мой комментарий
std::bit_cast
должно помочь, если это разные «базовые» целые числа, не так ли?
@user24551355 user24551355 вся необходимая информация должна быть в вашем вопросе. Но в любом случае я не могу ссылаться на стандарт по этому поводу, я просто знаю, что такая ситуация практически в любой существующей реализации (а я знаком со многими из них). Я знаю, что это вопрос языкового юриста, поэтому я написал комментарий, а не ответ.
@Raildex Я пишу это для C++13, хотя я могу использовать memcpy
@user24551355 целые числа фиксированной ширины являются только частью стандарта C++11 и далее.
@wohlstad, чего не хватает в моем вопросе? часть сокета не обязательна для вопроса, который я задаю, тогда на него должны ответить другие
@user24551355 user24551355 Я согласен, что ваш вопрос действителен как есть. Тем не менее, добавление некоторого контекста может помочь понять проблему. В любом случае я вижу, что вы получили ответ. Я думаю, что это хороший вариант.
гарантированно
uintXX_t
является беззнаковым типомintXX_t
Нет.
Стандарт гарантирует, что это правда.
Нет.
Если вы найдете реализацию, где это не так, надеюсь, кто-нибудь с форума подарит вам пиво. DeathStation 9000 не в счет, пожалуйста, не запускайте на нем свой код.
Мне нужно это, чтобы избежать UB при совмещении типов.
Просто напишите утверждение, чтобы компиляция не удалась, и напишите свое программное обеспечение, предполагая, что это правда.
Думаю, тогда я воспользуюсь статическим утверждением или воспользуюсь memcpy.
спасибо, что действительно ответили на мой вопрос
@user24551355 user24551355 из любопытства: какую систему вы на самом деле используете? Я имею в виду на общих я бы никогда не заподозрил, что мне нужно спрашивать о таких гарантиях в стандарте, потому что это всегда так.
«...Расширенные целочисленные типы определяются реализацией. Обратите внимание, что целочисленные типы фиксированной ширины обычно являются псевдонимами стандартных целочисленных типов...» см. Расширенные целочисленные типы