Я пытаюсь написать функцию, которая будет переинтерпретировать набор байтов как float
. Я просмотрел файл Stackoverflow question, который заставляет меня попробовать reinterpret_cast<>()
на массиве символов, и я начал экспериментировать с расщеплением поплавка на символы, а затем снова собрал его, но это только дает мне, казалось бы, случайные числа, а не то, что я думаю, что значение должно быть , так как выход каждый раз отличается. Несколько различных примеров:C++ - Работа с битами в значении с плавающей запятой
1.58661e-038
3.63242e-038
2.53418e-038
Поплавок переменная должна содержать значение 5.2.
Компиляция код:
float f = 5.2;
unsigned char* bytes = reinterpret_cast<unsigned char*>(&f);
float f1 = reinterpret_cast<float&>(bytes);
std::cout << f1 << std::endl;
дал мне
1.75384e-038
И тогда, конечно, другое число каждый раз при запуске программы. Интересно, однако, что если я помещаю код в цикл и выполняю его несколько раз за один проход, результат остается согласованным. Это заставляет меня думать, что это место памяти, но если это так, я не уверен, как получить доступ к реальному значению переменной - оператор разыменования не работает, потому что это не указатель.
Так что мой вопрос: как я могу разделить переменную типа float
(и позже на double
) на отдельные байты (позволяя мне изменять биты), а затем собрать ее.
Любая помощь была бы принята с благодарностью.
Вы близки, но вы должны бросить обратно в 'флоат *', то разыменовать что. (Обратите внимание, что вы играете опасно близко к Undefined Behavior здесь. Пожалуйста, не делайте этого в любом производственном коде.) – BoBTFish
Спасибо :) Не могли бы вы уточнить * Неопределенное поведение *? Я не уверен, что понимаю, что вы имеете в виду. –
@BradSullivan http://en.wikipedia.org/wiki/Undefined_behavior –