Forum: Mikrocontroller und Digitale Elektronik Richtig berechnen.


von frage (Gast)


Lesenswert?

Hallo.


Programmiere mit ATmega2560. Eine kurze Frage:


Was ist der unterschied von


uint8 x = 16000000 / (2000 * 100)

und

uint8 x = 16000000 / (2000UL * 100)



Vielen Dank :)

von UINT (Gast)


Lesenswert?

Du solltest das Ergebnis casten. Denn das Ergebnis passt nicht zum
Typ von x (8 Bit).
Oder gleich 80 hinschreiben.

von ghzh (Gast)


Lesenswert?

Durch UL wird die Multiplikation als 32Bit Berechnung ausgeführt, ohne 
als int (=16 Bit auf AVR).
Variante 1 dürfte also überlaufen, wodurch das komplette Ergebnis falsch 
ist.

von Karl H. (kbuchegg)


Lesenswert?

> ... 2000 * 100 ...

2000 ist ein int. Also 16 Bit
100 ist ein int. Also 16 Bit

Damit wird diese Multiplikation als 16*16 Bit Multiplikation ausgeführt, 
welches ein 16 Bit Ergebnis liefert.
Das theoretisch korrekte Ergebnis, 200000, ist aber zu groß für ein 16 
Bit Ergebnis.
Daher hast du einen Überlauf und ein falsches Ergebnis.

> ... 2000UL * 100 ...

2000UL ist ein unsigned long. Also 32 Bit
100 ist ein int. Also 16 Bit

Daher wird zunächst der kleiner der beiden Datentypen an den größeren 
angepasst. Aus dem 16-Bit int wird ein 32-Bit unsigned long erzeugt.

Damit wird dann diese Multiplkation als 32*32 Bit Multiplikation 
ausgeführt, welche ein 32 Bit Ergebnis liefert.
Das theoretisch korrekte Ergebnis, 200000, ist mit einem 32 Bit Ergebnis 
darstellbar.
Daher kriegst keinen Überlauf und ein richtiges Ergebnis.

: Bearbeitet durch User
von frage (Gast)


Lesenswert?

Vielen Dank an Karl Heinz für die ausführliche Antwort!! :)
Danke auch an ghzh.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.