Tag: 工会

是通过C99中未指定的联合进行types化处理,并在C11中指定?

堆栈溢出问题的一些答案获取浮点的IEEE单精度位提示使用union结构进行types双关(例如:将float的位转换为uint32_t ): union { float f; uint32_t u; } un; un.f = your_float; uint32_t target = un.u; 但是,根据C99标准(至less草案n1124),联合体的uint32_t成员的值似乎未指定,其中第6.2.6.1.7节指出: 当一个值存储在uniontypes的对象的成员中时,不与该成员相对应但与其他成员相对应的对象表示的字节取未指定的值。 C11 n1570草案至less有一个脚注似乎暗示这不再是这种情况(见6.5.2.3脚注95): 如果用于读取联合对象内容的成员与上次用于在对象中存储值的成员不相同,则该值的对象表示forms的适当部分将被重新解释为新types中的对象表示forms,如如6.2.6所述(一个有时称为“types双关”的过程)。 这可能是一个陷阱代表。 不过,C99草案中的第6.2.6.1.7节的内容与C11草案中的内容相同。 这个行为在C99下实际上是不确定的吗? 它已经在C11中指定了吗? 我意识到,大多数编译器似乎支持这一点,但它是很好的知道,如果它在标准中指定,或者只是一个非常常见的扩展。

访问不活动的联盟成员和未定义的行为?

我的印象是,除了最后一组之外,访问一个union成员是UB,但我似乎无法find一个可靠的参考(除了答案是UB,但没有任何标准的支持)。 那么,这是不确定的行为?