2015-04-08 2 views
1

Я пытаюсь написать функцию, которая будет переинтерпретировать набор байтов как 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) на отдельные байты (позволяя мне изменять биты), а затем собрать ее.

Любая помощь была бы принята с благодарностью.

+4

Вы близки, но вы должны бросить обратно в 'флоат *', то разыменовать что. (Обратите внимание, что вы играете опасно близко к Undefined Behavior здесь. Пожалуйста, не делайте этого в любом производственном коде.) – BoBTFish

+0

Спасибо :) Не могли бы вы уточнить * Неопределенное поведение *? Я не уверен, что понимаю, что вы имеете в виду. –

+1

@BradSullivan http://en.wikipedia.org/wiki/Undefined_behavior –

ответ

6

bytes является указатель.

Изменить

float f1 = reinterpret_cast<float&>(bytes); 

в

float f1 = *reinterpret_cast<float*>(bytes); 
// Cast to a different pointer...^
//  ^...and dereference that pointer. 
+0

Работает как шарм. Большое спасибо. –

Смежные вопросы