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 :)
Du solltest das Ergebnis casten. Denn das Ergebnis passt nicht zum Typ von x (8 Bit). Oder gleich 80 hinschreiben.
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.
> ... 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.