Ergebnis der Multiplikation in AVRStudio

Gast #180481
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
Gast #180482
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
Gast #180483
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?
Gast #180484
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.