Как получить представление с плавающей запятой без UB в C ++? - PullRequest
1 голос
/ 13 октября 2019

Насколько я знаю, все «традиционные» способы сделать это, а именно reinterpret_cast указателя и union с полями int и float, являются UB как нарушение строгого алиасинга ( вC ++, а не в C ).
Итак, как это сделать правильно без неопределенного поведения?

Могу ли я сделать reinterpret_cast для char * и memcpy это для uint32_t? А может std::launder поможет?

1 Ответ

1 голос
/ 13 октября 2019

Стандартный способ сделать это, как указывает Джейсон Тернер , - это использовать memcpy:

float f = 1.0;
std::byte c[sizeof(f)];
memcpy(c, &f, sizeof(f));

Возможно, вы думаете, что не хотите копироватьвсе, что вы просто хотите увидеть биты / байты. Что ж, компиляторы умны, и они фактически оптимизируют его, как продемонстрировал Джейсон, так что не беспокойтесь и используйте memcpy для такого рода вещей и никогда reinterpret_cast.

...