Еще один пример того, как конвертировать во втором случае:
#include <stdio.h>
#include <string.h>
#include <stdint.h>
int main() {
uint32_t fi = 0x3f520000;
float f;
memcpy(&f, &fi, sizeof(f));
printf("%.7g\n", f);
}
печатает:
0.8203125
так ты и ожидал.
Подход, который я использовал, это memcpy
, который является самым безопасным для всех компиляторов и лучшим выбором для современных компиляторов (GCC начиная с приблизительно 4.6, Clang начиная с 3.x), которые интерпретируют memcpy
как "приведение битов" в таком случае и оптимизировать его эффективным и безопасным способом (по крайней мере, в «размещенном» режиме). Это все еще безопасно для старых компиляторов, но не обязательно эффективно таким же образом; некоторые могут предпочесть приведение через объединение или когда-либо через другой тип указателя. Об опасностях, связанных с этим, см. здесь или, как правило, ищите «наказание типа и строгое алиасинг».
(Кроме того, могут существовать некоторые странные платформы, которые страдают от проблемы с порядком байтов, в которой целочисленный порядок байтов отличается от числа с плавающей точкой; байты отличаются от 8 битов и т. Д. Я их здесь не рассматриваю.)
ОБНОВЛЕНИЕ: я начал отвечать на первоначальную версию вопроса. Да, приведение битов и преобразование значений даст принципиально разные результаты. Вот как работают числа с плавающей запятой.