если вы используете разделение
я есть 18-битное целое число, которое дополняет два, и я хотел бы преобразовать его в число со знаком, чтобы я мог лучше его использовать. На платформе, которую я использую, интервалы составляют 4 байта (то есть 32 бита). На основании этого поста:
Преобразование необработанного 14-битного второго дополнения в 16-разрядное целое число со знаком
Я попробовал следующее, чтобы преобразовать число:
using SomeType = uint64_t;
SomeType largeNum = 0x32020e6ed2006400;
int twosCompNum = (largeNum & 0x3FFFF);
int regularNum = (int) ((twosCompNum << 14) / 8192);
Я сдвинул число в 14 раз, чтобы получить знаковый бит как наиболее значимый бит, а затем разделил его на 8192 (в двоичном виде это 1, за которым следуют 13 нулей), чтобы восстановить величину (как упомянуто в посте выше). Тем не менее, это не похоже на работу для меня. Например, ввод 249344 дает мне -25600, что на первый взгляд кажется неправильным. Что я делаю неправильно?