Приведение типа в c: unsigned int to float - PullRequest
0 голосов
/ 08 июня 2011

Я обмениваюсь данными последовательно между хост-компьютером и встроенным процессором. На встроенной стороне мне нужно проанализировать символьные строки для данных с плавающей запятой и целочисленных данных. В настоящее время я делаю что-то вроде этого:

inline float32* fp_unpack(float32* dest, volatile char* str) {
    Uint32 temp = (Uint32)str[3]<<24;
    temp |= (Uint32)str[2]<<16;
    temp |= (Uint32)str[1]<<8;
    temp |= (Uint32)str[0];
    temp = (float32)temp;
    *dest = (float32)temp;

    return dest;
}

Где str имеет четыре символа, каждый из которых представляет байт числа с плавающей запятой. Байты в строке упорядочены с прямым порядком байтов.

В качестве примера я пытаюсь извлечь число 100.0 из ул. Я проверил содержимое строки:

с [0]: 0x00, с [1]: 0x00, с [2]: 0х20, с [3]: 0x41,

, что является 32-битным представлением с плавающей запятой 100.0. Кроме того, я убедился, что функция успешно устанавливает временное значение 0x41200000. Тем не менее, dest заканчивается как 0x4e824000. Я знаю, что проблема возникает из строки: * dest = (float32) temp, которая, как я надеялся, просто скопировала бы биты из temp в dest с помощью typepecast, чтобы компилятор был доволен.

Однако я понял, что этого не произойдет, так как операция: float x = (float) 4/3 фактически конвертирует 4 в 4.0, то есть изменяет биты.

Как я могу привести биты в temp в dest?

Заранее спасибо

edit: Обратите внимание, что 0x4120000 в качестве целого числа равно 1092616192, что в виде числа с плавающей точкой равно 0x4e82400

Ответы [ 4 ]

5 голосов
/ 08 июня 2011

Вам нужно разыграть указатели.Приведение значений просто конвертирует int в float.Попробуйте:

*dest = *((float32*)&temp);
4 голосов
/ 08 июня 2011

Переносимый способ, который не вызывает неопределенное поведение из-за нарушений правил наложения имен:

float f;
uint32_t i;
memcpy(&f, &i, sizeof f);
3 голосов
/ 08 июня 2011

Вот еще одно решение:

union test {
     float f;
     unsigned int i;
} x;

float flt = 100.0;
unsigned int uint;

x.f = flt;
uint = x.i;

Теперь unit имеет битовую комбинацию, которая была в f.

0 голосов
/ 15 июня 2011

Разве это не Hex (IEEE754) представление числа с плавающей запятой 100.0 -> 0x42c80000

...