2013-04-26 79 views
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; 

为什么会发生这种情况?怎么能改变这个?

+2

我可以解释39352,但48350确实看起来像一个错误。 – 2013-04-26 14:47:15

+0

@DanielFischer也许你应该解释一下39352,我想知道它为什么可以不是12190. – weston 2013-04-26 14:59:58

+0

@DanielFischer:我的错误。 39852是。我会更新这个问题。 – sheetansh 2013-04-26 15:00:54

回答

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_MAX的最小允许值是2^16 - 1,这意味着unsigned int必须至少16位宽。

+0

感谢您的数学输入。我明白现在它是如何工作的。所以我现在要坚持不签名。但是现在不要关闭这个问题,因为这只是更大问题的一部分。非常感谢丹尼尔! – sheetansh 2013-04-26 15:13:51