Нет совместимого способа преобразования подписанных/беззнаковых знаков одного и того же размера.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Нет совместимого способа преобразования подписанных/беззнаковых знаков одного и того же размера.

Сообщение Anonymous »

Боюсь, что я могу упустить что-то тривиальное, но, похоже, не существует реального безопасного способа преобразования в/из знакового типа, если вы хотите сохранить исходное беззнаковое значение.

В reinterpret_cast 5.2.10 не перечисляет преобразование целого числа в целое число, поэтому оно не определено (и static_cast не определяет никакого дополнительного преобразования). Что касается интегральных преобразований, то в 4.7.3 в основном говорится, что преобразование больших беззнаковых чисел будет определяться реализацией (поэтому не переносимо).

Это кажется ограниченным, поскольку мы знаем, например, что uint64_t должен на любом оборудовании безопасно конвертироваться в int64_t и обратно без изменения значения. Кроме того, правила стандартных типов макетов фактически гарантируют безопасное преобразование, если бы мы использовали memcpy между двумя типами вместо присваивания.

Я прав? Есть ли законная причина, по которой нельзя переинтерпретировать_cast между целочисленными типами достаточного размера?



Пояснение: определенно подписанная версия unsigned не гарантирует значение, но я рассматриваю только обратный путь (unsigned => Signed => unsigned)



ОБНОВЛЕНИЕ. Внимательно изучив ответы и перепроверив стандарт, я считаю, что работа memcpy на самом деле не гарантирована, поскольку нигде не указано, что эти два типа совместимы по макету, и ни один из них не является типом char. Дальнейшее обновление, изучение стандарта C, этот memcpy должен работать, так как размер цели достаточно велик, и он копирует байты.



ОТВЕТ: Кажется, нет никакой технической причины, по которой reinterpret_cast не разрешили выполнить это преобразование. Для этих целочисленных типов фиксированного размера гарантированно работает memcpy, и действительно, пока промежуточный тип может представлять все битовые шаблоны, можно использовать любой промежуточный тип (float может быть опасным, поскольку могут быть шаблоны ловушек). В общем, вы не можете использовать memcpy между любыми стандартными типами макетов, они должны быть совместимыми или иметь символьный тип. Здесь целые числа имеют особое значение, поскольку имеют дополнительные гарантии.

Подробнее здесь: https://stackoverflow.com/questions/946 ... -same-size
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»