我需要将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。
答案 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是最干净,最可靠和最便携的解决方案(注意字节顺序)。