mikrocontroller.net

Forum: Compiler & IDEs Ergebnis der Multiplikation in AVRStudio


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir ein kleines Programm geschrieben, welches ich jetzt mit
Hilfe des AVRStudio debugge. Dabei habe ich das folgende Problem:

Ich multipliziere zwei 8 bit Zahlen, doch das Produkt entspricht nicht
dem richtigen Ergebnis. Ein Beispiel ist folgendes:

uint32_t tmp = 255 * 255;

Eigentlich erwartet man einen Wert von 65025, aber AVRStudio zeigt mir
ein Ergebnis von 0xFFFFFE01 an, also vier F zu viel...


Kann mir jemand helfen, ich waere sehr dankbar! Mein Controller ist ein
ATMega8515, ich benutze den neuesten AVR-GCC.


Gruss, Sven

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Warnung vom Compiler? (overflow?)

 volatile uint32_t tmp = 255*255;
 17a:  81 e0         ldi  r24, 0x01  ; 1
 17c:  9e ef         ldi  r25, 0xFE  ; 254
 17e:  af ef         ldi  r26, 0xFF  ; 255
 180:  bf ef         ldi  r27, 0xFF  ; 255
 182:  8d 83         std  Y+5, r24  ; 0x05
 184:  9e 83         std  Y+6, r25  ; 0x06
 186:  af 83         std  Y+7, r26  ; 0x07
 188:  b8 87         std  Y+8, r27  ; 0x08

  volatile uint32_t tmp = 255UL*255;
 17a:  81 e0         ldi  r24, 0x01  ; 1
 17c:  9e ef         ldi  r25, 0xFE  ; 254
 17e:  a0 e0         ldi  r26, 0x00  ; 0
 180:  b0 e0         ldi  r27, 0x00  ; 0
 182:  8d 83         std  Y+5, r24  ; 0x05
 184:  9e 83         std  Y+6, r25  ; 0x06
 186:  af 83         std  Y+7, r26  ; 0x07
 188:  b8 87         std  Y+8, r27  ; 0x08

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, der Compiler schickt mir keine Warnung, aber wenn ich eine
Typkonversion durchfuehre (unsingned long), dann klappt es. Macht fuer
mich aber nicht so richtig sinn, denn wann genau muss ich denn die
Konversion durchfuehren?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C Typkonvention: die Multiplikation wird als `int' durchgeführt.
Durch den Überlauf wird das Ergebnis negativ.  Anschließend wird es
auf eine uint32_t zugewiesen, dabei wird die negative Zahl
vorzeichenrichtig erweitert.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das wusste ich nicht. Da habt ihr mir sehr geholfen!

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.