2013-04-26 74 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