这是怎么回事?

时间:2013-04-26 14:43:36

标签: c microcontroller type-conversion

我使用的是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;

为什么会这样?怎么能改变这个?

1 个答案:

答案 0 :(得分:3)

我要走出困境并假设你获得的价值实际上是

39352

这是16位宽unsigned int的正确结果。

无符号整数类型的算术被指定为算术模2^N,其中N是类型中的值位数,或者 width

1219000 = 18*(2^16) + 39352

并且使用16位宽unsigned int,结果是数学结果的其余部分,减去模2^16 = 65536

其他提到的值48350,39852,40352都意味着编译器违反了标准,因为数学结果1219000与其中任何一个之间的差异不是2^16的倍数,并且允许的最小值UINT_MAX的值为2^16 - 1,这意味着unsigned int 必须至少为16位宽。