Getting the IEEE Single-precision bits for a float

五迷三道 提交于 2019-12-01 00:50:28

You can use type punning with a union,

union {
    float f;
    uint32_t u;
} un;
un.f = your_float;
uint32_t target = un.u;

to get the bits. Or you can use memcpy.

You could creat a union type that contains a float and an unsigned int, store a value into the float member, then read it out of the int, like so:

union reg_val
{
  float f_val;
  unsigned int i_val;
} myRegister;
myRegister.f_val = 2.39;
printf("target = %08X", myRegister.i_val);

If you're trying to simply display the integral value of the float as it's stored in memory, then try using a union:

union {
    float a;
    unsigned int target;
} u;

Store the float value:

u.a = 2.39;

Print both float and integer values:

printf ("a = %f\n", u.a);
printf ("target = %08X\n", u.target); /* you could use %u to show decimal */

No compiler warnings. I use GNU compiler (gcc) on Linux. Notice that target is not a pointer; this is the beauty (and hideousness) of unions. ;-)

EDIT: The union solution works everywhere I have tried it but somewhere on SO I had been pointed at standards that showed it didnt have to work. See the link below in the comments to find a LOT more info on this (Thank you Daniel!). Supposed to work or not supposed to work I would use it with care, I imagine endianness, etc gets involved as well (doubles broken into bytes, etc).

Another solution is a dummy asm function. For example on arm:

.globl echo 
echo:
   bx lr


unsigned int echo ( float );
...
unsigned int ra; float f;
f=1.0;
ra=echo(f);

some disassembly is required, needs to be on a system that doesnt have an fpu and/or uses gprs for carrying around floats.

memcpy as already mentioned is the cleanest and most reliable and portable solution (be aware of endianness).

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!