Hallo,
ich arbeite gerade in meiner Diplomarbeit an einem Programmiergerät für
einen Winkelsensor. Ich benutze dabei einen AVR mega8. Bei der
Berechnung einiger Werte habe ich unter anderem folgendes
1 | unsigned long int a = 0; // maximal 2^32 - 1 = 4.294.967.295
|
2 | unsigned long int b = 0;
|
3 | unsigned long int c = 0;
|
4 |
|
5 | calc_ang_rng_mult = ((1000 * (unsigned long int)ang_rng_mult) / 16384); // = 524.287.000 / 16.384 = 31.999,...
|
6 |
|
7 | a = (((unsigned long int)(clamp_hi - clamp_lo) * 100000) / 8192); // = 460.700.000 / 8.192 = 56.237,...
|
8 | b = ((180 * 10000000) / calc_ang_rng_mult); // = 1.800.000.000 / 31.999 = 56251,...
|
9 | c = ((unsigned int)a * (unsigned int)b); // = 56.251 * 31.999 = 1.799.975.749
|
10 | calc_ang_rng = (c / 100000);
|
Die dezimalen Maximalwerte habe ich jeweils als Kommentar in den Code
eingefügt. Die Variablen calc_ang_rng_mult, a und b werden richtig
berechnet. Die Werte stimmen mit dem überein, was als Kommentar in der
jeweiligen Zeile steht. Variable c erhält jedoch nicht den Wert
1.799.975.749 sondern nur 30.303. Warum ist das so? 1.799.975.749 müsste
ich doch in einer unsigned long int Variable darstellen können.
Für Hinweise oder Erklärungen wäre ich sehr dankbar! Wie das immer so
ist bei Diplomarbeiten: Die Zeit rennt...
Grüße,
Daniel