Estoy trabajando con HiTech PICC32 en la serie de microprocesadores PIC32MX, pero creo que esta pregunta es lo suficientemente general para cualquiera que sepa de C. (Esto es casi equivalente a C90, con sizeof (int) = sizeof (long) = sizeof (float) = 4.)Reensamblar float desde bytes en línea
Digamos que leo una palabra de datos de 4 bytes que representa un float
. Puedo convertirlo rápidamente a su valor real de flotación con:
#define FLOAT_FROM_WORD(WORD_VALUE) (*((float*) &(WORD_VALUE)))
Pero esto solo funciona para lvalues. No puedo, por ejemplo, el uso de este en un valor de retorno de la función como:
FLOAT_FROM_WORD(eeprom_read_word(addr));
¿Hay una manera breve y dulce para hacer esto en línea, es decir, sin una llamada de función o variable temp? Para ser sincero, no hay una ENORME razón para que evite una llamada a función o var adicional, pero me está molestando. Debe haber una forma en la que me estoy perdiendo.
Agregado: No me di cuenta de que WORD
era en realidad un typedef común. Cambié el nombre del argumento de macro para evitar confusiones.
"Pero esto solo funciona para los valores" ¿Quiere decir lvalues? De todos modos, con las optimizaciones su compilador debería eliminar la llamada a la función de todos modos; simplemente póngalo en una función y mire la asamblea para descubrirlo. – GManNickG
Lo corregido [l/r]. Veremos el montaje más tarde. – detly
Te recomiendo que pongas este tipo de cosas en una función de contenedor específica de la plataforma para mantener este código específico de la plataforma limitado a una pequeña parte de tu proyecto. –