2

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

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:警告:来自不兼容指针类型的赋值”

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

4

4 回答 4

5

您可以将类型双关语与联合一起使用,

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

得到位。或者你可以使用memcpy.

于 2012-07-24T19:47:57.103 回答
1

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

union reg_val
{
  float f_val;
  unsigned int i_val;
} myRegister;
myRegister.f_val = 2.39;
printf("target = %08X", myRegister.i_val);
于 2012-07-24T19:49:44.457 回答
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 是最干净、最可靠和可移植的解决方案(注意字节序)。

于 2012-07-24T20:34:00.107 回答
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指针;这就是工会的美丽(和丑陋)。;-)

于 2012-07-24T20:02:50.200 回答