我使用的是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;
为什么会这样?怎么能改变这个?
答案 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位宽。