#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);
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxjc3RkaW8+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFFfMjNfOAp7CiAgICBpbnQzMl90IGZyYWN0aW9uYWwgOiAgODsKICAgIGludDMyX3QgaW50ZWdyYWwgICA6IDIzOwp9OwoKc3RhdGljX2Fzc2VydChzaXplb2YoUV8yM184KSA9PSBzaXplb2YoaW50MzJfdCksICJTaXplcyBkaWZmZXIhIik7CgpRXzIzXzggb3BlcmF0b3IqKGNvbnN0IFFfMjNfOCYgbGhzLCBjb25zdCBRXzIzXzgmIHJocykKewogICAgLy8gTWF0aCBpcyBpbmNvcnJlY3QgaGVyZSwgb2YgY291cnNlIQogICAgcmV0dXJuIHsKICAgICAgICBsaHMuZnJhY3Rpb25hbCAqIHJocy5mcmFjdGlvbmFsLAogICAgICAgIGxocy5pbnRlZ3JhbCAqIHJocy5pbnRlZ3JhbCB9Owp9CgppbnQgbWFpbigpCnsKICAgIGludDMyX3QgZW5jb2RlZFsyXSA9IHsgKDMyMSA8PCA4KSArIDExLCAwIH07CiAgICBwcmludGYoImVuY29kZWQgPSAlMDh4XG4iLCBlbmNvZGVkWzBdKTsKCiAgICBRXzIzXzgqIGRlY29kZWQgPSByZWludGVycHJldF9jYXN0PFFfMjNfOCo+KGVuY29kZWQpOwogICAgZGVjb2RlZFsxXSA9IGRlY29kZWRbMF0gKiBkZWNvZGVkWzBdOwogICAgcHJpbnRmKCJkZWNvZGVkID0gJTA2eC4lMDJ4XG4iLCBkZWNvZGVkWzBdLmludGVncmFsLCBkZWNvZGVkWzBdLmZyYWN0aW9uYWwpOwogICAgcHJpbnRmKCJyZXN1bHQgID0gJTA2eC4lMDJ4XG4iLCBkZWNvZGVkWzFdLmludGVncmFsLCBkZWNvZGVkWzFdLmZyYWN0aW9uYWwpOwp9