Выбор ответа Senior Типы и неопределённое поведение обновлено
Перетолковать float как биты
Вопрос
Как корректно получить биты float f в виде std::uint32_t в C++20?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: auto u = std::bitcast<std::uint32t(f);. std::bitcast (C++20) копирует представление объекта и работает для тривиально копируемых типов одного размера.
Варианты ответа
auto u = *reinterpret_cast<std::uint32_t*>(&f);auto u = std::bit_cast<std::uint32_t>(f);правильный ответauto u = static_cast<std::uint32_t>(f);- Через
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 ошибок.
Ещё по теме «Типы и неопределённое поведение»
- Порядок байтов: перевернуть uint32 и посчитать единицы
- Умножение int64 с проверкой переполнения
- Середина двух int64 без переполнения
- std::bit_cast
- Что C++20 изменил для знаковых целых
- Порядок вычисления аргументов функции
- Объясни, что такое неопределённое поведение
- Продвижение unsigned char