关于C/C++共用体(Union)与字节序的用法正确性确认
共用体(Union)安全用法疑问解答
先看你给出的共用体定义:
union { uint16_t ab; struct { uint8_t b; uint8_t a; }; };
针对你的三个理解,逐一确认:
关于C99及后续标准的合法性
你的理解正确。C99及之后的标准允许写入共用体的一个成员后,读取另一个成员(只要涉及的类型符合标准布局要求)。所以不管是设置ab后读取a/b,还是修改a/b后读取ab,都是合法操作,不属于未定义行为。补充一点:这里的匿名结构体是C11才正式纳入标准的语法,C99里属于编译器扩展,但核心的共用体跨成员访问规则在C99就已经确立。关于C++中的未定义行为
这个理解也对。C++标准一直严格限制共用体的访问规则:写入某一个成员后,只能读取同一个成员,跨成员读取属于未定义行为。虽然部分编译器(比如GCC、Clang)会提供类似C的扩展支持,但从标准层面来说,这种操作是不合法的。关于字节序的影响
完全正确。a和b对应ab的哪个字节完全由机器的字节序决定:- 小端序机器中,低地址存储低字节,所以
b是ab的低有效字节(LSB),a是高有效字节(MSB); - 大端序机器中,低地址存储高字节,此时
b会是MSB,a是LSB。
所以用这种方式拆分多字节类型时,必须明确目标机器的字节序,或者通过代码处理字节序兼容性问题。
- 小端序机器中,低地址存储低字节,所以
内容的提问来源于stack exchange,提问作者You'reNotARobot
相关产品推荐
相关产品推荐

