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

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