C中的算术运算

时间:2014-07-22 08:29:49

标签: c arithmetic-expressions

我想知道这样的事情在C编程中是否可行:

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

其中:

  • I_scaledint(16位)
  • I_Avglong(32位)
  • i_scalerint(16位)
  • TWOPOWER24 = 2^24

I_avg max value = 134217720。 i_scaler最大值= 37780

我问这个是因为中间操作占用的空间比int多,但最后结果低于16位。这可行吗?

谢谢

1 个答案:

答案 0 :(得分:4)

要存储将16位数与32位数相乘的中间结果,需要一种能够存储48位的类型。在您的示例中,编译器首先会将两个操作数提升为32位值(架构上为long),并且在分割之前结果也会被截断为32位,因此您无法获得正确的答案

最简单的方法可能是简单地将其中一个操作数强制转换为long long,尽管您需要检查编译器是否愿意将其有效地转换为32位算术:

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