使用 Microchip C 编译器(基于 Gnu C 编译器),我需要处理两个整数值并返回一个整数值。整数是 16 位宽,长整数是 32 位。
在计算过程中,会超出16bit的范围。这是我到目前为止所做的:
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 到 12bit)乘以 3000 将超过 16bit。最后乘法的结果要除以4095,结果又会小于16bit。
IMO,我的代码非常丑陋,因为我不知道如何做得更好。我如何确保编译器在计算期间使用 32 位长整数而不进行所有显式转换?
最佳答案
如果您正确定义了 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
;世界是一个快乐的地方(代码是干净的,没有城堡)。
关于c - 使用两个整数接收操作的长值 (GNU C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302300/