You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:24:53