获取浮点数的IEEE单精度位

时间:2012-07-24 19:37:27

标签: c embedded xilinx

我需要将IEEE单精度浮点数写入特定地址的32位硬件寄存器。为此,我需要将float类型的变量转换为无符号整数。我可以得到这样的整数表示:

float a = 2.39;
unsigned int *target;
printf("a = %f\n",a);
target = &a;
printf("target = %08X\n",*target);

返回:

a = 2.390000
target = 4018F5C3

一切都好。但是,这会导致编译器警告“cast.c:12:warning:from different compatible pointer type”

有没有其他方法可以做到这一点,不会产生警告?这是针对特定的硬件,我不需要处理不同的字节顺序等,并且我不想因为性能原因而循环遍历每个字符串,因为其他一些问题往往会提示。看起来您可以在C ++中使用reinterpret_cast,但我使用的是C。

4 个答案:

答案 0 :(得分:5)

你可以使用带有联合的类型惩罚,

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

得到这些位。或者您可以使用memcpy

答案 1 :(得分:1)

您可以创建一个包含float和unsigned int的union类型,将值存储到float成员中,然后将其读出int,如下所示:

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

答案 2 :(得分:0)

如果您只想显示存储在内存中的float整数值,请尝试使用联合:

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

存储浮动值:

u.a = 2.39;

打印浮点值和整数值:

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

没有编译器警告。我在Linux上使用GNU编译器(gcc)。 请注意target 不是指针;这是工会的美丽(和丑陋)。 ; - )

答案 3 :(得分:0)

编辑:联盟解决方案适用于我尝试过的所有地方,但在某处我已被指出标准,表明它没有必要工作。请参阅以下评论中的链接以查找有关此内容的更多信息(谢谢丹尼尔!)。假设工作或不工作,我会谨慎使用它,我想也会有字节顺序等(双打成字节等)。

另一个解决方案是虚拟asm功能。例如,在手臂上:

.globl echo 
echo:
   bx lr


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

需要进行一些反汇编,需要在没有fpu的系统上和/或使用gprs来携带浮点数。

如前所述,memcpy是最干净,最可靠和最便携的解决方案(注意字节顺序)。