#include <cstdint>
#include <cstdio>

using namespace std;

struct Q_23_8
{
    int32_t fractional :  8;
    int32_t integral   : 23;
};

static_assert(sizeof(Q_23_8) == sizeof(int32_t), "Sizes differ!");

Q_23_8 operator*(const Q_23_8& lhs, const Q_23_8& rhs)
{
    // Math is incorrect here, of course!
    return {
        lhs.fractional * rhs.fractional,
        lhs.integral * rhs.integral };
}

int main()
{
    int32_t encoded[2] = { (321 << 8) + 11, 0 };
    printf("encoded = %08x\n", encoded[0]);

    Q_23_8* decoded = reinterpret_cast<Q_23_8*>(encoded);
    decoded[1] = decoded[0] * decoded[0];
    printf("decoded = %06x.%02x\n", decoded[0].integral, decoded[0].fractional);
    printf("result  = %06x.%02x\n", decoded[1].integral, decoded[1].fractional);
}