C 获取浮点的IEEE单精度位

C 获取浮点的IEEE单精度位,c,embedded,xilinx,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:警告:

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


有没有其他不产生警告的方法?这是针对特定硬件的,我不需要处理不同的endianness等,也不想像其他一些问题所建议的那样,出于性能原因而循环遍历每个字符。看起来你可以在C++中使用RealTytPayCask,但是我使用C.< /P> < P>你可以使用一个联合的类型双关,

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

去弄点东西。或者您可以使用
memcpy

您可以创建一个包含浮点和无符号int的
联合
类型,将一个值存储到浮点成员中,然后从int中读取,如下所示:

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

如果您试图简单地显示存储在内存中的
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
不是指针;这就是工会的美丽(和丑恶)

EDIT:union解决方案在我尝试过的任何地方都有效,但在某个地方,所以我被指向的标准表明它不一定有效。请参阅下面评论中的链接,以查找有关此的更多信息(谢谢Daniel!)。应该工作还是不应该工作我会小心使用它,我想象endianness等也会参与其中(双倍分解为字节等)

另一个解决方案是虚拟asm函数。例如,在arm上:

.globl echo 
echo:
   bx lr


unsigned int echo ( float );
...
unsigned int ra; float f;
f=1.0;
ra=echo(f);
需要进行一些拆卸,需要安装在没有fpu和/或使用gprs携带浮子的系统上


如前所述,memcpy是最干净、最可靠和可移植的解决方案(请注意持久性)。

。。。丹尼尔F.和头发葡萄干比我先到了。我想我应该打字快一点!除非自上次草案以来有所更改,否则6.5.2.3中的脚注95表示“如果用于读取联合对象内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的适当部分将重新解释为6.2.6中所述的新类型中的对象表示(有时称为“类型双关”的过程)。”。这可能是一个陷阱表示法。”,所以官方认为它是有效的。(好吧,脚注只是信息性的,所以没有明确要求它有效)。@DanielFischer:n1124草案似乎没有脚注(或者我错过了)。第6.2.6.1.7节似乎有这样的约定:“当值存储在联合类型对象的成员中时,不对应于该成员但却对应于其他成员的对象表示字节采用未指定的值。”附录J.1中重申了警告,该警告声称以下内容未指定:“除存储在(6.2.6.1)中的最后一个成员以外的联合成员的值”啊,我谈到了n1570(C11)。很抱歉没有提及。@DanielFischer:我觉得这足够让人困惑,可以把它当作一个问题:。也许你可以解释一下?