0

使用 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 位长整数,而无需进行所有显式转换?

4

1 回答 1

3

如果您正确定义了 VOLTAGE,则其余部分会因为通常的转换规则而到位。

#define VOLTAGE 3000L

long voltage = (adcValue * VOLTAGE) / ADCRANGE;

这就是它所需要的。

你为什么问?因为当编译器计算出如何处理乘法时,它必须将 a long( VOLTAGE)乘以int( adcValue),并且必须这样做的方式是将 a 提升int为 a long,从而产生long结果。当它现在计算除法时,它long在 LHS(股息)上有 a,int在 RHS(除数)上有一个,因此它必须再次将 a 转换int为 a long,将计算作为 a 进行long,产生 a long。然后它必须处理分配。LHS 是一个long; RHS 上的表达式是 a long;世界是一个快乐的地方(代码干净且无cast)。

于 2013-08-18T18:23:30.200 回答