Приведите int16_t памяти для плавания - PullRequest
1 голос
/ 16 июля 2010

У меня есть функция из внешнего источника, которая возвращает массив из 2 элементов uint16_t (которые я приводил к int).

Я уже смог привести их к одному "большому" int ((i1 << 16) + i2)

Теперь мне нужно иметь возможность разыграть это с плавающей точкой, сохраняя значение точки как в памяти.

Может кто-нибудь предложить путь или указать мне правильное направление?

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

Ответы [ 3 ]

5 голосов
/ 16 июля 2010

Предлагаю очень четко указать, что вы бездельничаете и использовать memcpy:

float a;
int b;

memcpy(&a,&b,min(sizeof(a),sizeof(b)));

кто-то может столкнуться с вашим кодом, когда вы давно ушли, и в этом случае это покажет, что что-то особенное происходит намеренно .

2 голосов
/ 16 июля 2010

Я бы использовал союз:

union fltconv {
    float f;
    uint32_t i;
} u;
u.i = ((uint32_t) i1 << 16) | i2;
float f = u.f;

Это более ясно о том, что вы делаете. Имейте в виду, что это очень непереносимо.

0 голосов
/ 16 июля 2010

Может быть, что-то подобное будет работать?

uint32_t a = ....; // Contains your big int.
float b = *(float*)&a;

Конечно, для этого нужно знать, что int имеет тот же размер, что и float ...

...