Ряд ответов на вопрос о переполнении стека Получение битов с одиночной точностью IEEE для float предполагает использование структуры union
для персонализации типа (например: поворот биты a float
в uint32_t
):
union {
float f;
uint32_t u;
} un;
un.f = your_float;
uint32_t target = un.u;
Однако значение члена uint32_t
объединения представляется неуказанным в соответствии со стандартом C99 (по крайней мере, проект n1124), где в разделе 6.2.6.1.7 указано:
Когда значение хранится в члене объекта типа union, байты представления объекта, которые не соответствуют этому элементу, но соответствуют другим членам, принимают неопределенные значения.
По крайней мере одна сноска проекта C11 n1570, по-видимому, подразумевает, что это уже не так (см. сноску 95 в 6.5.2.3):
Если элемент, используемый для чтения содержимого объекта объединения, не совпадает с элементом, который последний раз использовался для сохранить значение в объекте, соответствующая часть представления объекта значения переинтерпретируется как представление объекта в новом типе, как описано в 6.2.6 (процесс, иногда называемый "типом" каламбурная). Это может быть ловушечное представление.
Однако текст в разделе 6.2.6.1.7 в проекте C99 такой же, как в проекте C11.
Действительно ли это поведение не указано в C99? Стало ли это указано в C11? Я понимаю, что большинство компиляторов, похоже, поддерживают это, но было бы неплохо узнать, указано ли это в стандарте или просто очень распространенное расширение.