我有这段代码:
typedef union MyUnion {
int ival;
float fval;
} MyUnion;
MyUnion myUnion;
myUnion.fval = 3.0f;
someFuncCall(myUnion.ival);
当我要求ival时,我到底在做什么?我猜我要求浮点数(编码为?)为int。我还假设它与在内存中共享相同的空间有关吗?但是,我绝对不确定。这是我在向Vivado Suite中的FPGA发送浮点数据时必须使用的技巧。预计所有数据均以整数形式输入。我真的很感激任何彻底澄清正在发生的事情或只是指向资源。谢谢!
答案 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可能在HO
或LO
边界上对齐,并且与实现有关。