我正在努力学习更多有关 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 位整数,将与 l
和 h
共享相同的内存位置,它们指的是较低和高 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/