Hallo Leute folgendes Problem habe ich. Ich verwende einen Atmega 8 der soll eine Multiplikation durchführen wie folgt. (später währe die 1023 ein wert vom ADC) uint32_t data_32 = 1023 * 8191; hier bekomme ich die meldung overflow. wenn ich jedoch hingehe: uint32_t data_32 = 8379393; ist das ganze kein Problem. Hat jemand einen vorschlag was ich alternativ machen könnte?? Gruß
Mathias Feld schrieb: > Hat jemand einen vorschlag was ich alternativ machen könnte?? uint32_t data_32 = 1023 * (uint32_t)8191;
Hallo, GCC interpretiert die Zahlen mit 16-Bit-Breite, wenn nicht anders angegeben. Dementsprechend wird auch nur eine Multiplikation mit einem 16-Bit-Ergebniss durchgeführt. Durch die bereits erwähnte Typenwandlung ( (uint32_t) ) wird der Compiler dazu bewegt, die Multiplikation mit 32 Bit auszuführen.
Bisschen kürzer wirds mit dem 'UL'-suffix:
1 | uint32_t ui32 = 1023 *8191UL; |
Technisch gesehen langt es nur einen der Operanden auf 32 vorzeichenlose Bits aufzublasen. Wenns mans 'sauber' haben will macht man das bei beiden/allen.
Rowland schrieb: > GCC interpretiert die Zahlen mit 16-Bit-Breite Nur bei 8 oder 16 Bit Targets. Nicht nur GCC sondern jeder C Compiler nimmt "int" an. Also auch "unsigned".
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.