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

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