mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rechnen mit uint32_t statt uint16_t


Autor: Philipp Horenz. (phil_phil)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp Horenz. schrieb:

> uint32_t Ergebnis = 0xFFFF * 0xFFFF;

So nicht.

> uint32_t Ergebnis = 0xFFFFUL * 0xFFFFUL;

Aber so.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:

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

Der Prozessor nicht, wohl aber C.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Philipp Horenz. (phil_phil)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp Horenz. (phil_phil)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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 . . .

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.