Multiplikation von 2er Komplement Darstellung

Gast #513700
Lesenswert?
• ▲
▼
Hallo an alle,
wie kann man elegant Vorzeichenbehaftete Integer Zahlen (Ergbnis von 2er 
Komplement Addition) multipliziern.

a) allgemeine Methode ?
b) spezialle (einfache) Multiplikation mit *2 *4  *8 etc....

Im Moment würde ich eine negative Zahl (2er Komp.) wieder zu einer 
positven Ganzahl umwandeln, dann Shift Operation oder mul Befehl 
anwenden und dann das Ergebnis wieder komplementieren.

Ich bitte um Kommentare!

Gruß
Stefan
Gast #513703
Lesenswert?
• ▲
▼
Das Ergebnis ist ja bis zu doppelt so gross wie die Operanden. Ein 
C-Compiler beispielsweise interessiert sich bei "*" aber nur für die 
untere Hälfte. Und die ist unabhängig davon, ob die Operanden mit oder 
ohne Vorzeichen sind, nur die obere Hälfte unterscheiden sich. Also 
kannst du ja nach Anforderung ggf. auf die Unterscheidung verzichten.

Und was die Shift-Operationen bei Zweierpotenzen angeht, da empfehle ich 
ein paar Minuten Einsatz der eigenen grauen Zellen.
Gast #513709
Lesenswert?
• ▲
▼
Hi A.K.
das mit den Shift Operationen ist schon klar - das Problem ist nur das 
die nicht auf 2er Komplemente angewendet werden können, oder ?

Das bei 8bit muls bis zu 16 bit rauskommen is auch klar!

Ich verwende übrigens einen ATmega8 mit assembler.

Kann der MUL oder FMUL-Befehl mit 2er Komplementen umgehen ?

Danke
Stefan
Gast #513766
Lesenswert?
• ▲
▼
@A.K.

Ja-Warum eigentlich nicht !!!!

Ich bin gerade aufgewacht - war ein blöder Denkfehler.

Es geht:
Multiplikation: Shift in Richtung höherwertiges bit und Auffüllen des 
LSB mit '0'.

Division: Anderstherum und MSL auffüllen mit '1' bei negativen und '0' 
bei positiven Zahlen.

Manchmal führt die richtige Frage - zur richtigen Lösung !

Danke
Gast #513883
Lesenswert?
• ▲
▼
Die Shifterei hat natürlich erhebliche Genauigkeitsprobleme --> dein 
Beispiel von oben: -5/2 ist gleich -3

-5   entspricht  0b1011
shift nach rechts und MSB mit 1 auffüllen liefert 0b1101
und das ist gleich -3 in der 2er-Komplement Norm.

O.K. damit kann ich leben - will ja kein Taschenrechner bauen sondern 
einen PI oder PID Regler und die Regler Konstante entsprechend 
aufbereiten. Dies geschieht mit 16Bit Auflösung, da sollte der 
Rundungsfehler akzeptabel sein.

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.