1

8 ビット マイクロコントローラを使用しています。そして、これは私がやりたい計算です:

unsigned int Vin_kl30 = 0;
unsigned int val_kl30; // val_kl30 gets the value from ADC.
int Vref = 5;   
Vin_kl30 = (unsigned int) val_kl30 * Vref; // this returns 12190
Vin_kl30 =   Vin_kl30 * 100; // expected value: 1219000 but i get 39852 ???
temp_kl30 = Vin_kl30;

なぜこのようになるのでしょうか?どうすればこれを変更できますか?

4

1 に答える 1

3

私は四肢に出て、あなたが得る価値が実際にあると仮定します

39352

これは、16 ビット幅の正しい結果ですunsigned int

符号なし整数型の算術演算は、型の値のビット数または2^Nを法とする算術演算であると指定されています。N

1219000 = 18*(2^16) + 39352

および 16 ビット幅unsigned intの場合、結果は数学的な結果の剰余であり、モジュロを減じたもの2^16 = 65536です。

他の言及された値 48350、39852、40352 はすべて、コンパイラが標準に違反していることを意味します。これは、数学的な結果 1219000 とそれらのいずれかの差が の倍数ではなく、2^16最小許容値UINT_MAX2^16 - 1であるためです。少なくとも 16 ビット幅である必要があります。unsigned int

于 2013-04-26T15:08:48.977 に答える