我想知道这样的事情在C编程中是否可行:
I_scaled = (I_Avg * i_scaler) / (TWOPOWER24);
16b 32b 16b 2^24
其中:
I_scaled
是int
(16位)I_Avg
是long
(32位)i_scaler
是int
(16位)TWOPOWER24 = 2^24
I_avg max value = 134217720。 i_scaler最大值= 37780
我问这个是因为中间操作占用的空间比int多,但最后结果低于16位。这可行吗?
谢谢
答案 0 :(得分:4)
要存储将16位数与32位数相乘的中间结果,需要一种能够存储48位的类型。在您的示例中,编译器首先会将两个操作数提升为32位值(架构上为long
),并且在分割之前结果也会被截断为32位,因此您无法获得正确的答案
最简单的方法可能是简单地将其中一个操作数强制转换为long long
,尽管您需要检查编译器是否愿意将其有效地转换为32位算术:
I_scaled = ((long long)I_Avg * i_scaler) >> 24;