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-bit wide 的正确结果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,这意味着unsigned int 必须至少 16 位宽。

于 2013-04-26T15:08:48.977 回答