在以下代码中
#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
。
有人可以解释两个输出吗?
答案 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'
是字符0x000004D2
,0x00
,0x00
,0x04
。另一方面,如果您在0xD2
中存储四个字符'1'
,'2'
,'3'
和'4'
,那么u.string
中的值将是u
,即825373492十进制,而不是1234。
union存储你放入它的任何位,但你必须跟踪这些位应该如何解释。