联合中float的内存分配

时间:2018-02-13 08:12:43

标签: c

在以下代码中

#include <stdio.h>

union s1
{
    int s;
    float a;
}k;

int main()
{
    k.s=2147483640;
    printf("%f\n",k.a);
}

我得到的输出是nan

对于相同的代码,如果我用10替换2147483640,我得到的输出是0.0000000

有人可以解释两个输出吗?

1 个答案:

答案 0 :(得分:2)

  

有人可以解释两个输出吗?

在C中,union实际上只是一个可以用几种不同方式解释的值。如果您将float数据放入联合中,然后尝试将其读作int,那么您很可能会得到一些不太合理的内容,因为{{1}的格式与int非常不同。反过来也是如此:由于float的格式与float的格式完全不同,因此尝试将int数据解释为int会产生废话。你可能得到float,但你也可能得到一些看起来有效但不是真的值。

您可以在此处存储nan数据:

  

k.s = 2147483640;

在这里,您尝试将该数据重新解释为int

  

的printf(&#34;%F \ n&#34;,K.A);

不要这样做。如果您要将float中存储的值从k转换为int,请将其明确转换为演员:

float

这是一个可能更直观的例子:

printf("%f\n",(float)k.s);

现在,如果我们设置union { int num; char[4] string; } u; ,那么u.num = 1234中的值将是数字 1234或十六进制中的u。您不会期望0x000004D2会为您提供字符u.string'1''2''3',对吧? '4'是字符0x000004D20x000x000x04。另一方面,如果您在0xD2中存储四个字符'1''2''3''4',那么u.string中的值将是u,即825373492十进制,而不是1234。

union存储你放入它的任何位,但你必须跟踪这些位应该如何解释。