X = 01001001 および Y = 10101010
これらを足し合わせたい場合、どうすればいいですか? それらは「2 の補数」です... いろいろ試してみましたが、さまざまな種類のルールがあるように見えるため、正しい答えが得られるかどうかはよくわかりません。
それが正しいことを確認したいだけです: 1.
負の数を変換
しないで、それらをそのまま追加します
f.eks
01001001+10101010 = 11110011 => 00001100 => 1101 => -13
それとも?
1. マイナスを変換する
2. それらを足し合わせてマイナスを変換する
f.eks
01001001+10101010 => 01001001 + 01010110 => 10011111 => 01100001 => -97
したがって、基本的に私がやりたいことは、XY、および X を取ることです。 +Y
誰かがそれを行う方法を教えてもらえますか?
いくつかのリソース サイト:
Student-Binary
celtickane
swarthmore
4 に答える
2 の補数の優れた点は、バイナリ レベルではアルゴリズムではなく解釈の問題であることです。2 つの符号付き数値を加算するためのハードウェアは、符号なし数値の場合と同じです (フラグ ビットは無視されます)。
あなたの最初の例 - 「それらを追加するだけ」 - はまさに正しい答えです。あなたの例の数字
- 01001001 = 73
- 10101010 = -86
したがって、正解は確かに -13 です。
減算は、2 の補数に特別な処理を必要としないという点でまったく同じです。「減算するだけ」です。
興味深いのは、オーバーフロー/アンダーフロー ビットの処理です。73 - (-86) の結果を 8 ビットの 2 の補数として表すことはできません...
2 の補数を理解していることを確認するために、正の数から負の数 (またはその逆) に変換します。各ビットを反転し、結果に 1 を追加します。
たとえば、正の数 X = 01001001 は負の数として 10110101+1=10110110 になります。負の数 Y = 10101010 は、正の数として 01010101+1=01010110 になります。
X から Y を減算するには、Y を否定して加算します。IE 01001001 + 01010110。
2 の補数の加算では、2 つの引数の符号が反対の場合、特別な処理は必要ありません。バイナリで通常行うようにそれらを追加するだけで、結果の符号は保持する符号です。
あなたの混乱は、関連する数字の幅が原因である可能性があります. これをよりよく理解するには、符号なし整数から符号付き整数を作成してみてください。
符号なし整数の MSB がすでに 0 の場合、符号付きとして読み取って同じ結果を得ることができます。
MSB が 1 の場合、左側に 0 を追加して符号付きの数値を取得できます。すべての符号付き数値を符号拡張 (つまり、MSB が 0 の場合は 0 を追加し、MSB が 1 の場合は 1 を追加) して、同じ幅の数値を取得し、算術演算を「通常どおり」実行できるようにする必要があります。
たとえば、数字を使用して:
X = 01001001: 符号なし、MSB は 0、何もしません。
Y = 10101010: 署名済み、X で何もしない、まだ何もしない。
しかし、X の MSB を 1 に変更すると、次のようになります。
X = 11001001: 符号なし、MSB が 1、0 を追加 --> 011001001
Y = 10101010: 符号付き、拡張 X なので、符号拡張 Y --> 110101010
これで、既に知っている方法で加算または減算できる 2 つの符号付き数値が得られました。