Выбор ответа Senior Типы и неопределённое поведение обновлено

Перетолковать float как биты

Вопрос

Как корректно получить биты float f в виде std::uint32_t в C++20?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: auto u = std::bitcast<std::uint32t(f);. std::bitcast (C++20) копирует представление объекта и работает для тривиально копируемых типов одного размера.

Варианты ответа

  1. auto u = *reinterpret_cast<std::uint32_t*>(&f);
  2. auto u = std::bit_cast<std::uint32_t>(f);правильный ответ
  3. auto u = static_cast<std::uint32_t>(f);
  4. Через union { float f; std::uint32_t u; }: записать f, прочитать u

Разбор

std::bit_cast (C++20) копирует представление объекта и работает для тривиально копируемых типов одного размера. До C++20 то же делали через std::memcpy.

  • Чтение float через uint32_t* нарушает strict aliasing: UB, оптимизатор может переставить чтения.
  • static_cast преобразует значение (3.7f станет 3), а не биты.
  • Чтение неактивного члена union в C++ UB (в C это разрешено), хотя GCC документирует поддержку как расширение.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.