Forum: Compiler & IDEs Ergebnis der Multiplikation in AVRStudio


von Sven (Gast)


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

von mthomas (Gast)


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

von Sven (Gast)


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?

von Jörg Wunsch (Gast)


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.

von Sven (Gast)


Lesenswert?

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

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.