Я использую следующий код для сопоставления двух 16-разрядных целых чисел со знаком с верхним и нижним 16-битным 32-разрядным целым числом без знака.
inline uint32_t to_score(int16_t mg, int16_t eg) {
return ((1u * mg) << 16 | (eg & 0xFFFF));
}
inline int16_t extract_mg(uint32_t score) {
return int16_t(score >> 16);
}
inline int16_t extract_eg(uint32_t score) {
return int16_t(score & 0xFFFF);
}
Мне нужно выполнить различные вычисления на обоихmg
и eg
частей одновременно, перед интерполяцией двух частей в конце функции.
Насколько я понимаю, до тех пор, пока нет переполнения, было бы безопасно добавить две uint32_t
s создал to_score
, а затем извлек int16_t
s, чтобы найти результаты отдельных вычислений: то есть результаты, если бы я добавил значения для mg
и eg
отдельно.
IЯ не уверен, верно ли это предположение, если либо mg
, либо eg
отрицательны, либо этот метод можно использовать для вычитания, умножения и / или деления.
Какие операции можно ожидать для правильного функционирования?Существуют ли альтернативные способы представления двух целых чисел, которые можно быстро сложить / вычесть / умножить?