Hallo! Ich möchte eine Rechnung machen, wo 16 bit nicht mehr Ausreichen z.B.: 2^16 * 2^16 = 2^32 Ich benutze einen ATMEGA8 und das AVR Studio mit dem GCC Compiler. Da hier intern soweit ich weißt nur mit 16 bit gerechnet wird, wollt ich mal fragen, wie ich explizit mit 32 bit rechnen kann. Vielleicht so : uint32_t Ergebnis = 0xFFFF * 0xFFFF ? oder so : uint32_t Ergebnis = 0xFFFFUL * 0xFFFFUL ? Danke!
Philipp Horenz. schrieb: > Da > hier intern soweit ich weißt nur mit 16 bit gerechnet wird, wollt ich > mal fragen, wie ich explizit mit 32 bit rechnen kann. wie kommst du darauf das ein 8bit prozessor intern mit 16Bit rechnet?
Philipp Horenz. schrieb: > uint32_t Ergebnis = 0xFFFF * 0xFFFF; So nicht. > uint32_t Ergebnis = 0xFFFFUL * 0xFFFFUL; Aber so.
Peter schrieb:
> wie kommst du darauf das ein 8bit prozessor intern mit 16Bit rechnet?
Der Prozessor nicht, wohl aber C.
A. K. schrieb: > Peter schrieb: > >> wie kommst du darauf das ein 8bit prozessor intern mit 16Bit rechnet? > > Der Prozessor nicht, wohl aber C C Rechnet so wie die Datentype es vorgeben. ein int64 + int64 ist ein int64 dabei muss man nicht casten oder beachten. Also kann man ja wohl kaum sagen das C intern mit 16bit rechnet. ( bzw. klar rechnet es auch mit 16bit, aber auch mit 8,32 und 64bit)
OK, und was passiert wenn mein Ergebnis vom Typ uint16_t ist, aber meine Rechnung Werte enthält, die uint8_t, uint16_t und uint32_t sind? Bsp: uint8_t Ergebnis = (A B C) / 10000 wobei A, B uint8_t und C uint16_t Variablen sind und ich in diesem Fall A = 10, B = 100 und C = 1000 habe. Was kann ich dann tun?
> Was kann ich dann tun?
Mindestens einen davon auf uint32_t casten:
1 | uint8_t Ergebnis = ((uint32_t)A * B * C) / 10000 |
uint8_t Ergebnis = (A B C) / 10000 ersten würde ich C und die 1000 schon mal kürzen, aber darum geht es ja nicht. das Problem ist das A B C > int16 ist. Also würde es zu einem überlauf kommen. Daher musst du den Compiler sagen das er diese Rechnung mit 32bit machen soll. ( (uint32_t)A * (uint32_t)B * (uint32_t)C ) / 1000UL das sollte dann passen, könnte sein das man nicht jedes der Casts braucht aber sicher das wissen eventuell andere genauer.
Aber das Ergebnis (1000) wird trotzdem nicht in einen uint8_t passen.
Peter schrieb:
> C Rechnet so wie die Datentype es vorgeben.
Nicht wenn es sich um 8-Bit Datentypen handelt. C rechnet auf einem
8-Bit Prozessor formal mit mindestens 16 Bits, es sei denn du castest
explizit runter oder schaltest den Compiler auf non-Standard-Modus.
Darum ging es mir hier.
Gut, dann caste ich eine Variable auf uint32. Ist es eigentlich allgemein eher zu vermeiden mit 32bit zu rechenen? Ich hab nen richtig schlechts Gewissen :-D In meinem Fall würde das vielleicht einmal pro Sekunde oder sonstwie passieren. Also eigentlich ne Ewigkeit für den uc.. oder?!
@ Philipp Horenz. (phil_phil) >Ist es eigentlich allgemein eher zu vermeiden mit 32bit zu rechenen? Wat mutt, datt mutt. Siehe Festkommaarithmetik. >Ich hab nen richtig schlechts Gewissen :-D ;-) >In meinem Fall würde das vielleicht einmal pro Sekunde oder sonstwie >passieren. Also eigentlich ne Ewigkeit für den uc.. oder?! In der Tat . . .
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.