C union integer成员返回union中的数据,而float显示异常
在下面的代码中,如果我打印union成员的值,则未分配的成员C union integer成员返回union中的数据,而float显示异常,c,union,C,Union,在下面的代码中,如果我打印union成员的值,则未分配的成员int I输出515。我发现它给出了整个联合体的位置权重 Q:-但如果声明为float i输出0.000。这种行为的任何特殊原因。这是怎么回事 #include<stdio.h> int main() { union a { float i; char ch[2]; }; union a u; u.ch[0] = 3; u.ch[1] = 2;
int I代码>输出515
。我发现它给出了整个联合体的位置权重
Q:-但如果声明为float i代码>输出0.000
。这种行为的任何特殊原因。这是怎么回事
#include<stdio.h>
int main()
{
union a
{
float i;
char ch[2];
};
union a u;
u.ch[0] = 3;
u.ch[1] = 2;
printf("%d, %d, %f\n", u.ch[0], u.ch[1], u.i);
return 0;
}
#包括
int main()
{
联盟a
{
浮点数i;
char-ch[2];
};
美国工会;
u、 ch[0]=3;
u、 ch[1]=2;
printf(“%d,%d,%f\n”,u.ch[0],u.ch[1],u.i”);
返回0;
}
通过使用并集,该程序使两种不同的数据类型(在本例中为int/float和char[])共享同一内存区域。接下来,程序将内存区域指定为char,然后将其作为int/float读回。只有当写为char的值在读回该值的数据类型的上下文中“有意义”时,此操作才能成功。正如您所观察到的,对于“int”,它可能会返回一些值,因为C不会对整数值应用任何特殊编码(但也请参见)。然而,实数通常使用标准进行编码,因此,读回的值取决于解码的内容。我认为这可能也依赖于编译器,因为我看到相同代码的“nan”(不是数字)
#include<stdio.h>
int main()
{
union a
{
float i;
char ch[2];
};
union a u;
float f = 0.0;
u.ch[0] = 3;
u.ch[1] = 2;
printf("%d, %d, %f, %f\n", u.ch[0], u.ch[1], u.i, f);
return 0;
}
#包括
int main()
{
联盟a
{
浮点数i;
char-ch[2];
};
美国工会;
浮动f=0.0;
u、 ch[0]=3;
u、 ch[1]=2;
printf(“%d,%d,%f,%f\n”,u.ch[0],u.ch[1],u.i,f);
返回0;
}
输出:
3,2,nan,0.000000您的联合
只能保存一个或其他值的值,但不能同时保存这两个值。如果您给它的515
(二进制100000011
)作为浮点值没有意义。联合大小与它的最大成员大小相同。char[2]
的大小是2
(sizeof(char[2])
);i
的大小是i
的大小。不要混淆“大小”和“价值”是的,这回答了第二个问题。你能解决第一个问题吗?什么是“整个联合体的位置权重”?你能和我分享一个我以前没见过的引用吗?这意味着,当你用二进制格式表示你的联合,加上设定位的位置,你会得到一个数字。这里是515
,正如我在上面用一个图解释的那样。在C联合中,元素的内存是重叠的,因此,设置一个成员可能会影响其他成员,这也是联合的预期用途(否则,将使用struct)。您已经用图解释了它(尽管它可能需要稍微调整,因为int通常是4字节)。我不确定还有什么问题。