C
Nobuo T schrieb:
Das war ein Versuch zu verdeutlichen, dass bei Verwendung von imul immer eine vorzeichenbehaftete Multiplikation ausgefuehrt wird und die Ergebnisse (in Gaenze betrachtet) von imul und mul nur so lange vergleichbar sind, wie mit positiven Zahlen multipliziert wird. => Verwendung von imul als mul-Ersatz macht nicht uneingescharaenkt Sinn. Kam mir nicht deutlich genug rueber - wollte ich nur nochmal auf den Punkt bringen... ...whatever...
Ich seh' schon, das fuehrt nur zu Verwirrung und wird auch zu OT.
und genau das ist eben nicht der fall. es macht eben keinen unterschied, ob die benutzten zahlen negativ wären oder nicht - das niederwertige wort des ergebnis ist stets dasselbe:
seien a und b zwei integer mit n bits.
aua_uau sei der wert von a interpretiert als vorzeichenloser integer,
asa_sas der wert von a von interpretiert als vorzeichenbehafteter integer in 2er komplementdarstellung.
dann ist a_s=a_ua\_s = a\_ua_s=a_u wenn das höchswertige bit nicht gesetzt ist, andernfalls gilt a_s=a_u−2na\_s = a\_u - 2^na_s=a_u−2n
anolg seien bub_ubu und bsb_sbs definiert.
das ergebnis einer vorzeichenlosen multiplikation ist dann: (a_u∗b_u)mod2n(a\_u*b\_u) mod 2^n(a_u∗b_u)mod2n
das ergebnis einer vorzeichenbehafteten multiplikation ist je nachdem, welches vorzeichen asa_sas und bsb_sbs haben:
(a_u∗b_u)mod2n(a\_u*b\_u) mod 2^n(a_u∗b_u)mod2n
((a\_u-2^n)\*b\_u) mod 2^n = ((a\_u\*b\_u)-2^n*b_u) mod 2^n
= ((a\_u\*b\_u) mod 2^n - (2^n\*b\_u) mod 2^n) mod 2^n = (a\_u*b_u) mod 2^n
(a_u∗(b_u−2n))mod2n=(a_u∗b_u)mod2n(a\_u*(b\_u-2^n)) mod 2^n = (a\_u*b\_u) mod 2^n(a_u∗(b_u−2n))mod2n=(a_u∗b_u)mod2n
((a_u−2n)∗(b_u−2n))mod2n=(a_u∗b_u)mod2n((a\_u-2^n)*(b\_u-2^n)) mod 2^n = (a\_u*b\_u) mod 2^n((a_u−2n)∗(b_u−2n))mod2n=(a_u∗b_u)mod2n
(Anmerkung: im die frage ob -1 mod 2^n nun -1 oder 2^n-1 wäre, brauchen wir uns hier nicht kümmern, dank zweikomplement macht das keinen unterschied)
und das ist eben genau dasselbe, was bei vorzeichenloser multiplikation herauskommt. Häufig genug ist man ja gar nicht am exakten ergebnis interessiert, sondern nur an den niederwertigen bits des ergbnissen, und dann arbeitet man meist mit vorzeichenlosen zahlen. da halte ich es schon für bedeutsam, dass man in jedem falle bedenkenlos imul einsetzen kann, unabhängig davon, ob die höhstwertigen bits der argumente gesetzt sind oder nicht.