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
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.