あなたは鉛筆と紙...小学校のスタイルでこれを行うことができます
-1 * = -3 3、UMULL対7 * 3 = 21 SMULL
0b111 * 0b011
111111
* 000011
==========
111111
111111
000000
...
+
==========
11111101
(技術的徴候は以下のように広い内部ALUの入力として拡張される)
-3
同じ3ビット数を取るが、
0b111 * 0b011
000111
* 000011
=============
000111
000111
000000
+ ...
==============
0010101
をUMULL使用結果は21
で2の補数の美しさは、それを追加し、同じロジックを使用引くが、あなたは正しい答えを得るために伸びるためにサインをしなければならず、そこに擦り傷があります。符号なし符号はゼロを拡張します符号付き符号は符号を拡張します。 16ビット×16乗算を32ビットオペランドで実行する必要があるため、結果を格納するために必要なビット数が2倍になると乗算され、その上位16ビットには符号付き乗算と符号なしの間で変化します。一度署名したら、そこに違いがないので、同じ乗算ロジックを供給できることを確認してください。私は1つは、どのように追加と減算の仕事も、同じ加算器のロジックをフィードするとは、(借りてそれを呼び出すためにキャリービットを逆にする場合は)変更することがあります同様に引き分けに応じて異なりますが異なると主張することができると思います
は今、あなたの質問ごとに、はい、あなたは3ビットで3ビットを取る場合にのみ、ほとんど常に間違った答えである出力の下位3ビットを見て、とにかく同じ小学校の算数
AAAabc
DDDdef
=========
AAAabc
AAAabc
AAAabc
AAAabc
...
===========
3x3ビット入力の下位3ビットは、オリジナルの3ビット入力によって厳密に決定されます。符号拡張は、umullとsmullの間で変化します。面白い演習ですが、現実世界の使用があまりにも多くないので、ほとんどのオペランドの組み合わせはオーバーフローしますが、高い割合ではありません。
この演習をM * Nビットについて繰り返す場合は、符号拡張の影響を受けないMビットまたはNビットのうちの小さいほうにする必要があります。その単純な運動は読者に委ねられている。
最初に32ビットの2の補数で1 * 0xffffffffを計算してから、もう一度64ビットの2の補数で試してみてください; – Notlikethat
は宿題に関する質問ですか? –
@dwelch - いいえ、ちょうど好奇心。 – user200783