使用Microchip C编译器(基于Gnu C编译器),我需要处理两个整数值并返回一个整数值。整数为16位宽,long为32位。
在计算过程中,将超出16位的范围。这是我到目前为止所做的:
unsigned int calcVoltage(unsigned int adcValue){
long voltage = ((long)adcValue * (long)VOLTAGE) / (long)ADCRANGE;
return voltage; //12-bit ADC-Value, 3000mv max
}
VOLTAGE是一个常数,目前分配给3000。将adcValue(0到12位)乘以3000将超过16位。最后,乘法的结果将除以4095,结果将再次低于16位。
IMO,我的代码非常难看,因为我不知道如何做得更好。如何确保编译器在计算过程中使用32位长整数而不进行所有显式转换?答案 0 :(得分:3)
如果你正确定义了VOLTAGE,其余的就会因为通常的转换规则而落实到位。
#define VOLTAGE 3000L
long voltage = (adcValue * VOLTAGE) / ADCRANGE;
这就是全部。
为什么,你问?因为当编译器计算出如何处理乘法时,它必须将long
(VOLTAGE
)乘以int
(adcValue
),以及它必须做的方式这是通过将int
推广到long
,产生long
结果。当它现在评估除法时,它在LHS(被除数)上有long
,在RHS上有int
(除数)所以它必须将int
转换为long
再次,将计算作为long
进行计算,得到long
。然后必须处理分配。 LHS是long
; RHS上的表达式为long
;世界是一个幸福的地方(而且代码是干净的,无懈可击的)。