#include <cstdint>
#include <iostream>
int32_t interpret24bitAsInt32(unsigned char* bytes) {
int32_t const number =
(bytes[0] << INT32_C(16))
| (bytes[1] << INT32_C(8))
| bytes[2];
int32_t const correction =
(bytes[0] >> UINT8_C(7)) << INT32_C(24);
return number - correction;
}
int main() {
unsigned char n1[] = { 0x80, 0, 0};
std::cout << interpret24bitAsInt32(n1) << std::endl;
unsigned char n2[] = { 0x7F, 0xFF, 0xFF};
std::cout << interpret24bitAsInt32(n2) << std::endl;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludDMyX3QgaW50ZXJwcmV0MjRiaXRBc0ludDMyKHVuc2lnbmVkIGNoYXIqIGJ5dGVzKSB7CiAgaW50MzJfdCBjb25zdCBudW1iZXIgPQogICAgICAgIChieXRlc1swXSA8PCBJTlQzMl9DKDE2KSkKICAgICAgfCAoYnl0ZXNbMV0gPDwgSU5UMzJfQyg4KSkKICAgICAgfCAgYnl0ZXNbMl07CiAgaW50MzJfdCBjb25zdCBjb3JyZWN0aW9uID0gCiAgICAgKGJ5dGVzWzBdID4+IFVJTlQ4X0MoNykpIDw8IElOVDMyX0MoMjQpOwogIHJldHVybiBudW1iZXIgLSBjb3JyZWN0aW9uOwp9CgppbnQgbWFpbigpIHsKICB1bnNpZ25lZCBjaGFyIG4xW10gPSB7IDB4ODAsIDAsIDB9OwogIHN0ZDo6Y291dCA8PCBpbnRlcnByZXQyNGJpdEFzSW50MzIobjEpIDw8IHN0ZDo6ZW5kbDsKICB1bnNpZ25lZCBjaGFyIG4yW10gPSB7IDB4N0YsIDB4RkYsIDB4RkZ9OwogIHN0ZDo6Y291dCA8PCBpbnRlcnByZXQyNGJpdEFzSW50MzIobjIpIDw8IHN0ZDo6ZW5kbDsKfQ==