0

Microchip C Compiler (Gnu C Compiler に基づく) を使用して、2 つの整数値を処理し、整数値を返す必要があります。整数は 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 で除算されるため、結果は再び 16 ビット未満になります。

IMO、私のコードはかなり醜いです。より良い方法がわからないからです。明示的なキャストを行わずに、コンパイラが計算中に 32 ビット長整数を使用するようにするにはどうすればよいですか?

4

1 に答える 1

3

VOLTAGE を正しく定義すれば、通常の変換規則により、残りの部分はうまくいきます。

#define VOLTAGE 3000L

long voltage = (adcValue * VOLTAGE) / ADCRANGE;

それだけです。

なぜ聞くの?longコンパイラが乗算を処理する方法を理解するとき、コンパイラは( VOLTAGE) をint( )で乗算するadcValue必要があり、それを実行する方法は、intを aに昇格させて結果longを生成するlongことです。除算を評価するとlong、左辺 (被除数) にa がintあり、右辺 (除数)に a があるため、intを alongに再度変換し、 a として計算を行い、 alongを生成する必要がありlongます。その後、割り当てを処理する必要があります。LHS はlong; RHS の式はlong; 世界は幸せな場所です (そしてコードはクリーンでキャストレスです)。

于 2013-08-18T18:23:30.200 に答える