Search code examples
c++unions

C++ Unions Internals


I'm trying to learn mor eabout C++ and ran into some code in a chess program that I need help understanding. I have a union such as:

union b_union {

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

The above code falls into the else condition.

Bitboard is defined as uint64_t. If I have a value let's say 0x0025f780, which is 282578800148862, and I set union.b = 0x0025f780, then union.dw.l is updated to 16843134 and union.dw.h is updated to 65793. Intitially l and h start off with 3435973836. Internally, what happened? I'm fairly new to C++. Just trying to wrap my head around unions in how they work internally.

Thanks much for any insights.

David


Solution

  • Basically, a union lets you describe several ways a single piece of memory is used. The normal case is to store two unrelated values at the same location, which work as long as you use only one at the time. (Writing to one variant destroys the other.)

    Another very common use of unions is to access parts of another element (which, by the way, is undefined behavior). In your case, two views of a 64 bit integer. One is the entire integer and the other is the two halves, as separate 32 bit entities.

    Note that different computers store a 64 bit value differently. Some store the bytes from more valued to less valued (big endian), some the other way around (little endian), and some use a mixed form (mixed endian). The names, by the way, comes from The Travels of Gulliver, where some people ate the egg from the big side and some from the pointy side.

    In your case, I would suggest that you drop the union all together and access the parts using:

    low = uint32_t(b);
    high = uint32_t(b >> 32);
    

    The above will work on all architectures and is as fast, or even faster, that the union.