C union integer成员返回union中的数据,而float显示异常

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;

在下面的代码中,如果我打印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;
    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字节)。我不确定还有什么问题。