访问联合中不同类型的未分配值

时间:2014-09-07 12:49:56

标签: c unions

我有这段代码:

typedef union MyUnion {
    int ival;
    float fval;
} MyUnion;

MyUnion myUnion;
myUnion.fval = 3.0f;

someFuncCall(myUnion.ival);

当我要求ival时,我到底在做什么?我猜我要求浮点数(编码为?)为int。我还假设它与在内存中共享相同的空间有关吗?但是,我绝对不确定。这是我在向Vivado Suite中的FPGA发送浮点数据时必须使用的技巧。预计所有数据均以整数形式输入。我真的很感激任何彻底澄清正在发生的事情或只是指向资源。谢谢!

2 个答案:

答案 0 :(得分:2)

根据标准IEC9899 /2011§6.5.2.3,注释95你有:

  

如果用于读取union对象内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的相应部分将被重新解释为对象表示形式。 6.2.6中描述的新类型(有时称为“type punning”的过程)。这可能是陷阱表示。

所以你确实想要做的是什么,但它可能导致问题(例如成员的不同大小或不同的内存对齐)。

答案 1 :(得分:1)

您正在使用float的原始位并将其作为int进行插入。联合的工作原理是为最大的(sizeof)字段分配内存,并在每次为联合字段分配值时覆盖该部分内存。

在您的示例sizeof(int) == sizeof(float)中可能包含(均为32位)而不是使用union,您可以写:

float f = 3.0f;
someFuncCall(*(int*)&f);

但是,通常,您不知道联合字段在内存中的对齐方式。采取以下联盟:

union SomeUnion {
    char c;
    int i;
}

SomeUnion :: c和SomeUnion :: i可能在HOLO边界上对齐,并且与实现有关。