Forum: Mikrocontroller und Digitale Elektronik Rechnen mit uint32_t statt uint16_t


von Philipp H. (phil_phil)


Lesenswert?

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!

von Peter (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Philipp Horenz. schrieb:

> uint32_t Ergebnis = 0xFFFF * 0xFFFF;

So nicht.

> uint32_t Ergebnis = 0xFFFFUL * 0xFFFFUL;

Aber so.

von (prx) A. K. (prx)


Lesenswert?

Peter schrieb:

> wie kommst du darauf das ein 8bit prozessor intern mit 16Bit rechnet?

Der Prozessor nicht, wohl aber C.

von Peter (Gast)


Lesenswert?

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)

von Philipp H. (phil_phil)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Was kann ich dann tun?
Mindestens einen davon auf uint32_t casten:
1
uint8_t Ergebnis = ((uint32_t)A * B * C) / 10000

von Peter (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Aber das Ergebnis (1000) wird trotzdem nicht in einen uint8_t passen.

von (prx) A. K. (prx)


Lesenswert?

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.

von Philipp H. (phil_phil)


Lesenswert?

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?!

von Falk B. (falk)


Lesenswert?

@  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
Noch kein Account? Hier anmelden.