C++ union 内部

标签 c++ unions

我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如:

union b_union {

    Bitboard b;
    struct {
    #if defined (BIGENDIAN)
        uint32_t h;
        uint32_t l;
    #else
        uint32_t l;
        uint32_t h;
    #endif
    } dw;
};

以上代码属于else条件。

位板定义为 uint64_t。如果我有一个值,比如 0x0025f780,即 282578800148862,我设置 union.b = 0x0025f780,则 union.dw.l 更新为 16843134,union.dw.h 更新为 65793。最初 l 和 h 以3435973836. 在内部,发生了什么?我是 C++ 的新手。只是想了解 union 内部的工作方式。

非常感谢任何见解。

大卫

最佳答案

union 意味着组件将占用相同的内存位置。在您展示的代码示例中,目的是允许您直接引用 b 的高 32 位和低 32 位。

请注意,此代码调用未定义(或实现定义)的行为。这是因为您正在从写入数据的不同元素访问 union 元素。

因此 b 是一个 64 位整数,将与 lh 共享相同的内存位置,它们指的是较低和高 32 位。当然,它的有效性取决于机器的字节序——这就是为什么有预处理器 if-else 的原因。

编辑:您的特定示例也不正确。但这是一个固定版本:

当您设置 b = 282578800148862 时,(b = 0x101010101017e)。高低32位分别是:

00010101 0101017e

所以

l = 0x0101017e = 16843134
h = 0x00010101 = 65793

关于C++ union 内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7971967/

相关文章:

c++ - 是否有用于检测 USB 过流的 Windows API?

java - JVM 信号链 SIGPIPE

c++ - c++中的 union 它们是否可行

c++ - 使用 union 对 IP 地址进行多种解释?

c++ - 使用 gcc 写入 Unions

c++ - 当使用位域 union 替换位掩码时,访问非事件成员,好还是未定义?

c++ - 在 C++ 中同时运行具有不同参数的相同 exe

c++ - 使用命令行参数创建结构 vector

c++ - 搜索算法以查找列表中的 k 个最小值

c - union 和位域——它们如何工作?