0

Копирование битовую структуру значения float в наоборот uint32_t или (не бросая их), мы можем копировать биты байт в байт с использованием std::copy или memcpy. Другой способ заключается в использовании reinterpret_cast, как показано ниже:Копировать битовый шаблон: поплавок uint32_t

float f = 0.5f; 
uint32_t i = *reinterpret_cast<uint32_t*>(&f); 

или

uint32_t i; 
reinterpret_cast<float&>(i) = 10; 

Однако есть claim, что говорит два reinterpret_cast используемый выше, вызовите неопределенное поведение.

Это правда? Как?

+1

Как указано в ответе, это UB. утверждение, что 'sizeof (uint32_t) == sizeof (float)', хотя должно быть все, что вам нужно, чтобы быть уверенным, что оно будет работать. – NathanOliver

+0

@NathanOliver Но если компилятор выполняет оптимизацию псевдонимов на основе типа, он может разумно нарушить поведение, если вы не предоставляете '-fno-strict-aliasing' или что-то еще. – TartanLlama

+0

@TartanLlama Хорошая точка. проверка 'alignof' также может потребоваться. – NathanOliver

ответ

6

Да, это неопределенное поведение, поскольку это нарушает строгое правило сглаживанием:

[basic.lval]/10: Если программа пытается получить доступ к сохраненному значению объекта через glvalue, отличных от одного из следующих типов поведение не определено - динамический тип объекта,

- это резюме квалифицированных версия динамического типа объекта,

- тип похож (как это определено в 4.4) Т он динамический тип объекта,

- тип, который является знаком или без знака типа, соответствующего динамического типа объекта,

- типа, который является знаком или без знака типа, соответствующий автобиография квалификации версия динамического типа объекта,

- совокупность или объединение типа, который включает в себя один из вышеупомянутых типов между ее элементами или не- статических элементами данных (в том числе, рекурсивно, элемента или нестатического элемента данных суммарного или содержащегося объединения),

- тип типа базового класса (возможно cv-qualifded) динамического типа объекта,

- тип char или unsigned char.

Поскольку uint32_t не является ни один из вышеупомянутых при попытке получить доступ к объекту типа float, поведение не определено.

Смежные вопросы