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