Rechnen mit uint32_t statt uint16_t

OP #1641145
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!
Gast #1641166
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?
Gast #1641184
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)
OP #1641226
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?
Gast #1641240
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.
#1641248
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.
OP #1641291
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?!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren