gpt4 book ai didi

C++ union 内部

转载 作者:行者123 更新时间:2023-11-30 00:39:47 30 4
gpt4 key购买 nike

我正在努力学习更多有关 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com