2016-03-30 3 views
0

Я пытаюсь написать автоматизированную тестовую программу, которая требует от меня генерировать поток данных массива int array (который фактически хранит данные с плавающей запятой)Как преобразовать массив int (удерживая значение float в Hex) обратно в значение float в C

чтобы создать этот массив Int, я пытаюсь

  1. написать плавающее число в массив символов байт, а затем

  2. преобразовать массив символов байт в Int массив, который позже

  3. преобразовать число из массива int в плавающую точку (без потери десятичных точек).

Я был в состоянии сделать шаг 1 & 2 без проблем, но я не могу преобразовать Int массива обратно с плавающей запятой, используя (поплавок) (* INT_PTR).

Мой код:

int ibuff[10]; 

int *int_ptr; 

float f=0.1; 

char c [sizeof(float)]; 


memcpy(c, &f, sizeof(float)); //now c is 0x3f800000; 

ibuff[0]=(c[3]<<24 | c[2]<<16 | c[1]<<8 | c[0]); //ibuff[0] is now also 0x3f800000 

int_ptr=&ibuff[0]; 

printf("%f\n", (float)(*int_ptr)); //this will print out 1065353216.0000, and not 1.0 as I expected 
+0

Почему вы не используете массив float вместо массива int? – v7d8dpo4

+0

Почему и C++, и c? Знаете ли вы, что это разные языки? –

+0

Вы действительно ищете 'union {int i; float f; }; 'где вы будете присваивать' int' и читать из 'float'? –

ответ

0

Непосредственная проблема возникает из литья разыменованного целочисленного указателя int_ptr к float, а затем пытается напечатать это значение как float. Вы в настоящее время пытаетесь:

printf("%f\n", (float)(*int_ptr)); 

который, как вы нашли, не будет работать. То, что вы хотите сделать, это интерпретировать значение по адресуint_ptr как float. Для достижения этой цели, вам нужно:

printf("%f\n", *(float*)(int_ptr)); 

В то время как вы можете просмотреть адрес, как и все ваше подобие, вы должны убедиться, что вы не прервали из строгих-альясинга правил, установленных в C-стандарте по правилам 6.5 (6) и 6.5 (7). Указаны ограниченные исключения, но, как указано: «Цель ... заключается в том, чтобы указать те обстоятельства, при которых объект может быть или не быть псевдонимом». Технически ваш литой от int до float является нарушением, которое маскируется с помощью указателя (полученного через промежуточное использование массива символов, которое немного загрязняет воду).

0

В вашем заявлении для печати:

(float)(*int_ptr) 

Вы отливку Int к поплавку, т.е. (float)(int)(x) будет значение x как поплавок вместо int. То, что вы хотите, это память о том месте, которое interperated как поплавок, так что вам нужно:

*(float *)(int_ptr) 
Смежные вопросы