使用两个整数(GNU C)接收长操作值

时间:2013-08-18 18:20:31

标签: c casting int overflow long-integer

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

1 个答案:

答案 0 :(得分:3)

如果你正确定义了VOLTAGE,其余的就会因为通常的转换规则而落实到位。

#define VOLTAGE 3000L

long voltage = (adcValue * VOLTAGE) / ADCRANGE;

这就是全部。

为什么,你问?因为当编译器计算出如何处理乘法时,它必须将longVOLTAGE)乘以intadcValue),以及它必须做的方式这是通过将int推广到long,产生long结果。当它现在评估除法时,它在LHS(被除数)上有long,在RHS上有int(除数)所以它必须将int转换为long再次,将计算作为long进行计算,得到long。然后必须处理分配。 LHS是long; RHS上的表达式为long;世界是一个幸福的地方(而且代码是干净的,无懈可击的)。