我正在尝试学习早期的C++并在国际象棋程序中遇到一些我需要帮助理解的代码.我有一个工会,如:
union b_union {
    Bitboard b;
    struct {
    #if defined (BIGENDIAN)
        uint32_t h;
        uint32_t l;
    #else
        uint32_t l;
        uint32_t h;
    #endif
    } dw;
};
上面的代码属于其他条件.
位板定义为uint64_t.如果我有一个值,假设为0x0025f780,即282578800148862,并且我设置了union.b = 0x0025f780,则union.dw.l更新为16843134,union.dw.h更新为65793.最初l和h开始于3435973836.在内部,发生了什么?我对C++很新.试着在工会内部如何工作时尽力绕过工会.
非常感谢任何见解.
大卫
联合意味着组件将占用相同的内存位置.在您显示的代码示例中,目的是允许您直接引用上下32位b.
请注意,此代码调用未定义(或实现定义)行为.这是因为您正在从写入数据的其他元素访问union元素.
因此b,这是一个64位整数,将共享相同的内存位置,l并h指向低32位和高32位.当然,这的有效性取决于机器的endian  - 这就是为什么有预处理器if-else.
编辑:你的具体例子也不正确.但这是一个固定的版本:
当你设置b = 282578800148862,(b = 0x101010101017e).上下32位是:
00010101 0101017e
所以
l = 0x0101017e = 16843134
h = 0x00010101 = 65793