Арифметическая операция в C

Мне было интересно, возможно ли что-то подобное в программировании на языке C:

I_scaled = (I_Avg * i_scaler) / (TWOPOWER24);
 16b 32b 16b 2^24

где:

  • I_scaled - int (16 I_scaled)
  • I_Avg long (32 бит)
  • i_scaler - int (16 бит)
  • TWOPOWER24 = 2^24

Значение I_avg max = 134217720. Максимальное значение i_scaler = 37780

Я спрашиваю об этом, потому что промежуточные операции занимают больше места, чем int, но в конце результат меньше 16 бит. Это возможно?

спасибо

1 ответ

Чтобы сохранить промежуточный результат умножения 16-разрядного номера на 32-битный, вам нужен тип, который способен хранить 48 бит. В вашем примере компилятор сначала будет продвигать оба операнда до 32-битных значений (long на вашей архитектуре), и результат также будет усечен до 32 бит перед делением, поэтому вы не получите правильный ответ.

Самый простой подход может заключаться в простом переносе одного из операндов на long long, хотя вам нужно проверить, желает ли ваш компилятор его перевести на 32-разрядную арифметику:

I_scaled = ((long long)I_Avg * i_scaler) >> 24;

licensed under cc by-sa 3.0 with attribution.