Боюсь, что я упускаю что-то тривиальное, но, похоже, нет реального безопасного способа преобразования в / из типа со знаком, если вы хотите сохранить исходное значение без знака.
В reinterpret_cast, 5.2.10 не перечисляет преобразование целого числа в целое, поэтому оно не определено (и static_cast не определяет дополнительное преобразование). В интегральных преобразованиях 4.7.3 в основном говорится, что преобразование большого без знака будет определяться реализацией (следовательно, не переносимо).
Это кажется ограничением, так как мы знаем, например, что uint64_t
должен на любом оборудовании быть безопасно конвертируемым в int64_t
и обратно без изменения значения. Кроме того, правила для стандартных типов макетов фактически гарантируют безопасное преобразование, если бы мы использовали memcpy
между двумя типами вместо присвоения.
Я прав? Существует ли законная причина, по которой нельзя reinterpret_cast
между целочисленными типами иметь достаточный размер?
Пояснение: Определенно, подписанная версия неподписанного не является гарантированным значением, но я рассматриваю только круговую передачу (unsigned => sign => unsigned)
ОБНОВЛЕНИЕ : При внимательном рассмотрении ответов и перекрестной проверке стандарта я считаю, что на самом деле memcpy
не гарантированно работает, поскольку нигде не утверждается, что эти два типа совместимы с макетом, и ни один из типов символов. Дальнейшее обновление, копаясь в C-стандарте, этот memcpy должен работать, так как размер цели достаточно велик, и он копирует байты.
ОТВЕТ : По-видимому, нет технической причины, по которой reinterpret_cast не было разрешено выполнять это преобразование. Для этих целочисленных типов фиксированного размера гарантированно работает memcpy
, и действительно, если промежуточное звено может представлять все битовые комбинации, может использоваться любой промежуточный тип (типы с плавающей запятой могут быть опасными, поскольку могут существовать схемы перехвата). В общем случае вы не можете использовать memcpy между любыми стандартными типами макетов, они должны быть совместимы или иметь тип char. Здесь особые черты особые, так как они имеют дополнительные гарантии.