私はmビット×nビットの乗算((m + n)ビットの積を生成する)に対して、結果の最下位ビットは、乗算が符号なしであるか符号付きであるかにかかわらず常に同じであることがrecently learnedです。符号なし除算の結果と符号付き除算の結果との間に類似点はありますか?
mビット/ nビットの除算(mビット商とnビット剰余を生成する)の場合、符号付き除算と符号付き除算の両方で常に同じビットがありますか(forいくつかの入力)2つの除算方法は全く異なる結果を生み出しますか?
私はmビット×nビットの乗算((m + n)ビットの積を生成する)に対して、結果の最下位ビットは、乗算が符号なしであるか符号付きであるかにかかわらず常に同じであることがrecently learnedです。符号なし除算の結果と符号付き除算の結果との間に類似点はありますか?
mビット/ nビットの除算(mビット商とnビット剰余を生成する)の場合、符号付き除算と符号付き除算の両方で常に同じビットがありますか(forいくつかの入力)2つの除算方法は全く異なる結果を生み出しますか?
オペランドのいずれかにMSBが設定されている(つまり負の場合)符号なしおよび符号付き除算は著しく異なります。
両方のオペランドのMSBがゼロの場合(つまり、両方の数値が正の場合)、結果は同じになります。
符号なし除算を使用すると、オペランドのすべてのビットが符号なしとして解釈されます。つまり、負の数は(非常に)大きな整数として解釈されます。
符号付き除算を使用する場合、オペランドはまず絶対数に変換され、オペランドの符号が再適用されます。
mov eax,1
xor edx,edx
mov ecx,-1
div eax,ecx //eax = 0, because the -1 is interpreted as a large positive
div -1,2 -> $7FFFFFFFF because div 2 shifts bits right by 1.
数を次のよう
結果です。一部のプロセッサで
mov eax,1
xor edx,edx //cdq if eax is negative
mov ecx,-1
idiv eax,ecx //eax = -1, because 1/-1 = -1.
idiv -1,2 //-> 0 because 1 shr 1 = 0 and -0 is still 0.
div
(すべての正のオペランドと)それは思考 "あまり関係していますので、速くidiv
よりサイクルになります。しかし、分裂がひどく遅いという事実を考えると、とにかくこれはほとんど問題にならないでしょう。
divの前に 'xor edx、edx'、idivの前に' cdq'を忘れないでください。 (exをedxに拡張する:eax)。あなたの2番目の例では、 'eax'を2回書きました(-1/-1 => cdqに覚えていればエラーを割ります)。または、分割が簡単な別のISAを選択するだけです。または8ビットの配当(mov ax、-1'/div cl') –
前の質問からこれを行う方法を学んだことはありませんか?小学校の数学に戻って、長い区分(とにかく古い/遅い(多くの時計)部門が働いています)。
ビットパターン0b10101010/0b101(符号なし0xAA/5または符号付き-0x56/-3)を使用します。私は私の計算機を不正行為と使用しなければなりませんでした。とにかく簡単に一つの第一
-----------
101) 10101010
100010
-----------
101) 10101010
101
===
00101
101
===
00
ので、結果はその後の0x22
しかし、我々はあなたが小学校に手でそれを行うだろうかである符号なし行う必要がある正しい答えを得るために署名した部門のために、あります両方が結果が肯定的で陰性であったので、我々は代わりに0b1010110
11100
---------
11) 1010110
11
===
100
11
===
11
11
==
010
に0b11にを分割され、後に私たちが0b10101010に0b101を分割されていない記号を適用するので、答えは0x1cに剰余0x2のです。
加算/減算、符号付きおよび符号なし乗算と同様に、何も出てこないか、否定するか否かを判断します。除算は、シフトされた後に何度も何度も繰り返し追加された同じ数の乗算のようなものではありません。左から右に始まらないので、どのようにしてそれらの間に共通のパターンが生成されるのかわかりません。上にもそのことが示されていますが、あなたが1つを否定すると、多くの共通のビットが前面に表示されます。これはおそらく馬鹿です。
私は加算/減算とは異なり、defにビット変数abcを分割しようとするつもりはありませんし、それは何らかの割合のプロセッサが乗算や除算をしていないか、多分多くのロジックを使用することで乗算を高速化することができますが、それはおそらく分けても、それとも多くのクロックです。
おそらくハッカーズ・ディライトが分割のショートカットを見るのを見ているかもしれません。そのパターンから、ビットのいくつかのパーセンテージは同じになるかもしれませんが、私はそれを疑っています。実際のバイナリオペランドを分割ロジックに入れ、おそらく分子の上位ビットを同じ符号付きまたは符号なしにする必要がありますが、それは2つの全く異なる数であることを意味します。上で示したように、異なる符号付き表現を持つ同じビットパターンを取り、その同じビットパターンを符号なしまたは符号付き除算に供給すると、分子および/または分母に異なるビットパターンが得られ、したがって異なる結果が得られます。両方の数字が正の場合は、両方とも同じ結果が得られるはずです。
除数の符号ビットは3ビットですが、配当の符号ビットは8ビットですか?それはかなり奇妙に思える。 –
「1/u -1 = 0」vs「1/s -1 = -1」を考えてください。これらは最大限異なります。 – harold