「2の補数」とは何ですか?


434

私はコンピュータシステムのコースに参加しており、Two's Complementに部分的に苦労しています。私はそれを理解したいのですが、読んだすべてが私のために絵をまとめていません。ウィキペディアの記事、テキストブックなどのさまざまな記事を読みました。

したがって、私はこのコミュニティWikiの投稿を開始して、2の補数とは何か、それをどのように使用するか、キャストなどの演算(符号付きから符号なし、またはその逆)、ビット単位演算、ビットシフト演算中に数値にどのように影響するかを定義したいと思いました。

私が期待しているのは、プログラマが簡単に理解できる明確で簡潔な定義です。

回答:


627

2の補数は整数を格納するための巧妙な方法であるため、一般的な数学の問題の実装は非常に簡単です。

理解するには、数値を2進数で考える必要があります。

基本的には、

  • ゼロの場合は、すべて0を使用します。
  • 正の整数の場合、最大2 (ビット数 -1 -1でカウントアップを開始します。
  • 負の整数の場合もまったく同じことを行いますが、0と1の役割を切り替えます(したがって、0000から開始するのではなく、1111から開始します。これが「補数」の部分です)。

4ビットのミニバイトで試してみましょう(ニブル -1/2バイトと呼びます)。

  • 0000 - ゼロ
  • 0001 - 1
  • 0010 - 二
  • 0011 - 三
  • 01000111-4から7

それは私たちがポジティブに行くことができる限りです。2 3 -1 = 7。

ネガの場合:

  • 1111 -否定的なもの
  • 1110 -負の2
  • 1101 -負の3
  • 11001000-マイナス8に負の4

1000ポジティブではなく、ネガティブ(= -8)に対して1つの追加の値を取得することに注意してください。これは0000、ゼロに使用されるためです。これはコンピュータの数直線と考えることができます。

正の数と負の数の区別

これを行うと、最初のビットが「符号」ビットの役割を果たします。これは、負でない10進数値と負の10進数値を区別するために使用できるためです。最上位ビットが1である場合、バイナリは負であると言え、最上位ビット(左端)が0であるかのように、10進値は負ではないと言えます。

「1の補数」の負の数は、符号ビットを反転させてから、0から数えます。しかし、このアプローチは1000、「負のゼロ」として解釈しなければならず、混乱を招きます。通常、ハードウェアの近くで作業する場合にのみ、これについて心配する必要があります。


147
おそらく、2の補数の最も良い部分は、数学を単純化する方法です。追加してみてください2(0010)および-2(1110)を一緒にし、その結果、実際にはほとんど魔法のような0000、2 + -2 = 0であるので、あなたは、最上位ビットがオーバーフローである10000を取得
Naaff

96
簡単な加算と減算以外のもう1つの利点は、2の補数には1つのゼロしかないことです。単純な符号ビットを使用している場合、たとえば0001を使用して+1を表し、1001を使用して-1を表す場合、0000( "+0")と1000( "-0")の2つのゼロがあります。それは背後の本当の痛みです。
イェルクWミッターク

26
それが要点であることに賛成し、また、負の値が正の値よりも広い範囲を持つ理由を説明します。レンジ違いの理由を探しに来ました。
Ashwin、2014

2
「負の整数の場合も、まったく同じことを行いますが、カウントダウンして0と1の役割を切り替えます」と言ってはいけません
Koray Tugay

1
素晴らしい。ビットを負の整数に変換する追加の部分が追加されました。
Suraj Jain

339

ウィキペディアの記事よりもよく説明できるだろうか。

2の補数表現で解決しようとしている基本的な問題は、負の整数を格納する問題です。

最初に、4ビットで格納されている符号なし整数について考えます。次のものを持つことができます

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

ネガティブかポジティブかを示すものがないため、これらは署名されていません。

マグニチュードと超過表記

負の数を格納するには、いくつかのことを試すことができます。まず、最初のビットを+/-を表す符号ビットとして割り当て、残りのビットを等級を表す符号マグニチュード表記を使用できます。したがって、再び4ビットを使用して、1が-を意味し、0が+を意味すると仮定すると、

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

それで、あなたはそこで問題を見ますか?正と負の0があります。より大きな問題は、2進数の加算と減算です。符号の大きさを使用して加算および減算する回路は非常に複雑になります。

とは

0010
1001 +
----

別のシステムは過剰表記です。負の数を格納できます。2つのゼロの問題は解消されますが、加算と減算は依然として困難です。

したがって、2の補数が生じます。これで、正と負の整数を格納し、比較的簡単に演算を実行できます。数値を2の補数に変換する方法はいくつかあります。ここにある。

10進数を2の補数に変換

  1. 数値を2進数に変換します(現時点では符号を無視します)。たとえば、5は0101で、-5は0101です。

  2. 数が正数の場合は、これで完了です。たとえば、5は2の補数表記を使用したバイナリの0101です。

  3. 数が負の場合

    3.1補数を見つける(0と1を逆にする)たとえば、-5は0101なので、補数を見つけると1010

    3.2補数に1を加算1010 + 1 =1011。したがって、2の補数の-5は1011です。

では、2 +(-3)をバイナリで実行したい場合はどうでしょうか。2 +(-3)は-1です。これらの数値を追加するために符号の大きさを使用している場合、何をしなければなりませんか?0010 + 1101 =?

2の補数の使用は、それがいかに簡単かを考慮してください。

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

2の補数を10進数に変換する

1111を10進数に変換:

  1. 番号は1から始まるので、負なので、1111の補数である0000を見つけます。

  2. 0000に1を加えると、0001が得られます。

  3. 0001を1である10進数に変換します。

  4. 符号= -1を適用します。

多田!


45
私の意見では最良の回答です。
Koray Tugay

5
はい、これは非常に単純で、問題を非常によく説明しています
Max Koretskyi '27

3
両方の方法に変換するときに1つを追加すると、常に同じ数になる方法がわかりません。私の考えでは、ステップを逆にするか、何かを差し引くでしょう。
Marcos Pereira

2
なぜ補数に1を加えるのですか?
Zinan Xing 2017

4
この回答はウィキペディアで使用する必要があります。
ヒロキ

119

私が見たほとんどの説明と同様に、上記のものは2の補数を処理する方法については明確ですが、それら数学的に何であるかを実際には説明しません。少なくとも整数については、そうするようにします。最初におそらくおなじみの背景について説明します。

10進数の場合の動作を思い出してください
  。2345

  2 ×10 3 + 3 ×10 2 + 4 ×10 1 + 5 ×10 0と書く方法です。

同様に、バイナリは、同じ一般的な考え方に従って01だけを使用して数値を書き込む方法ですが、上記の10を2に置き換えます。次に、バイナリでは、
  1111

  1 ×2 3 + 1 ×2 2 + 1 ×2 1 + 1 ×2 0を書く方法で
あり、うまくいくと、15(10を底とする)になります。それは、
  8 + 4 + 2 + 1 = 15 だからです。

これはすべて正であり、正の数に適しています。人間が10進数で行うように、マイナス記号を前に付けるだけなら、負の数でも機能します。それは、コンピューターでも可能ですが、1970年代初頭以来、そのようなコンピューターを見たことはありません。別の議論の理由を残しておきます。

コンピュータの場合、負の数には補数表現を使用する方が効率的です。そして、これはしばしば見落とされているものです。補数表記は、通常の正の数の前にある暗黙のゼロでさえ、数の桁のある種の反転を含みます。問題が発生するので、それは厄介です。それらすべてですか?これは、考慮すべき無限の桁数になる可能性があります。

幸い、コンピューターは無限を表すものではありません。数値は特定の長さ(または必要に応じて幅)に制限されます。それでは、正の2進数に戻りますが、特定のサイズです。これらの例では8桁(「ビット」)を使用します。したがって、2進数は実際には
  00001111
または
  0 ×2 7 + 0 ×2 6 + 0 ×2 5 + 0 ×2 4 + 1 ×2 3 + 1×2 2 + 1 ×2 1 + 1 ×2 0になります

2の補数を負にするには、最初にすべての(2進数)桁を
  11110000に補い
、1を加えて
  11110001にし
ますが、-15を意味することをどのように理解すればよいでしょうか。

答えは、上位ビット(左端のビット)の意味を変更することです。このビットは、すべての負の数に対して1になります。変更は、それが中に表示される数字の値への貢献の符号を変更することになりますだから今、私たち。11110001を表すと理解される
  - 1 ×2 7 + 1 ×2 6 + 1 ×2 5 + 1 ×2 4 + 0 ×2 3 + 0×2 2 + 0 ×2 1 + 1 ×2 0
その式の前の「-」に注目してください。これは、符号ビットが-2 7の重み、つまり-128(ベース10)を運ぶことを意味します。他のすべての位置は、符号なし2進数と同じ重みを保持します。

-15を 計算すると、
  -128 + 64 + 32 + 16 + 1
になります。電卓で試してください。-15です。

コンピュータで負の数が表現される3つの主な方法のうち、2の補数は、一般的な使用の便宜のために優先されます。しかし、それは奇妙です。バイナリなので、可能なビットの組み合わせの数は偶数でなければなりません。正の数はそれぞれ負の数と組み合わせることができますが、ゼロは1つだけです。ゼロを否定するとゼロになります。したがって、もう1つの組み合わせがあります。符号ビットが1で、それ以外の場所はすべて0の数です。対応する正の数は、使用されているビット数に適合しません。

この数値のさらに奇妙な点は、1を補完して追加することで正数を形成しようとすると、同じ負数が返されることです。ゼロがこれを行うのは当然のようですが、これは予想外のことであり、私たちが慣れている動作とはまったく異なります。コンピュータを除いて、通常、この固定長の計算ではなく、無制限の数字の供給を考えるからです。

これは奇妙な氷山の一角のようなものです。水面下ではさらに多くの嘘が待ち構えていますが、この議論にはそれで十分です。固定小数点演算の「オーバーフロー」を調べれば、おそらくもっと多くを見つけることができます。あなたが本当にそれに入りたいなら、あなたはまた「モジュラー算術」を研究するかもしれません。


1
私はこの答えが好きです!2の補数を取り、1を追加する方法について説明します。
SJ。

私もこの答えが好きです。特に、負の数がどのように計算されるかを示す場所。ここでは、MSBだけでなく、整数が反転され、他の重み付けされた値が加算されると思いました。ありがとう、これで私の脳の障害が解決しました
user188757

逆数を持たない奇数ボールについて言及すると、よくできました。しかし、これについて私たちは何をしますか?誰かがオーバーフローフラグを反転させようとした場合、単にオーバーフローフラグを設定するだけですか?
NH。

他の答えは「方法」に焦点を当てていますが、この答えは「なぜ」で穏やかに私たちを導きます。それは私を助けました。ありがとう!
Abhishek Pathak

数値が11000 ... 000で終わっている場合、それを反転すると01000 ... 000になります。2の補数表記は、左端の表現された数字の左側にあるすべての数字はその数字と同じ値でなければならないという考えに基づいていますが、表現が1000 ... 000の数値を反転すると、真ではありません。
スーパーキャット

20

2の補数はバイナリの値を見つけるのに非常に便利ですが、そのような問題を解決するはるかに簡潔な方法を考えました(他の誰もそれを公開したことはありません)。

バイナリを例にとります。1101は、[スペース "1"が符号であると仮定して] -3に等しいです。

我々はこれを行うだろう2の補数を使用して... 0010フリップ1101 ... 0001 + 0010 ===を追加>は、= = 3.したがって、1101正のバイナリで私たちに0011 0011を与える-3

私が気づいたこと:

すべての反転と追加の代わりに、正のバイナリ(0101としましょう)を解くための基本的な方法は(2 3 * 0)+(2 2 * 1)+(2 1 * 0)+(2 0 * 1)= 5。

ネガティブでまったく同じコンセプトを実行してください!

たとえば、1101とします。

2 3 * 1 = 8ではなく最初の数値の場合、-(2 3 * 1)= -8を実行します。

次に、通常どおり続行し、-8 +(2 2 * 1)+(2 1 * 0)+(2 0 * 1)= -3を実行します


1
最善の方法は、2の補数を理解することです。これを読んだ後、上記の質問に対するすべての答えを理解することができました。
Shakeel Shahzad

1
これは、「コンピュータシステム:プログラマの視点」という本で言及されている方法です。
jimo 2015

1
これははるかに速い方法です!
シャンゼール2015

14

あなたがビット/小数/桁/何でも有限の数を持っていると想像してください。すべての桁が0であると0を定義し、自然に上方にカウントします。

00
01
02
..

最終的には、あふれます。

98
99
00

2桁で、0から100までのすべての数値を表すことができます。これらの数値はすべて正です!負の数も表現したいとしますか?

私たちが本当に持っているのはサイクルです。2の前の数は1です。1の前の数は0です。0の前の数は... 99です。

したがって、簡単にするために、50を超える数は負であるとしましょう。「0」から「49」は0から49を表します。「99」は-1、「98」は-2、...「50」は-50です。

この表現は10の補数です。コンピュータは通常、2の補数を使用します。これは、数字ではなくビットを使用することを除いて同じです。

10の補数のいいところは、加算が機能することです。正の数と負の数を追加するために特別なことをする必要はありません!


9

オドメーターをアナロジーとして使用して、jngによるRedditの素晴らしい説明を読みました。

ここに画像の説明を入力してください

これは便利な規則です。2進数で正の数を加算/減算する同じ回路と論理演算は、慣例を使用している場合でも正と負の両方の数値で機能します。

車の走行距離計を想像してみてください。(たとえば)99999で回転します。00000をインクリメントすると00001になります。00000をデクリメントすると、99999になります(ロールアラウンドのため)。1を99999に戻すと、00000に戻ります。99999が-1を表すと判断すると便利です。同様に、99998が-2を表すと決定することは非常に有用です。どこかで停止する必要があり、慣例により、数値の上半分は負(50000-99999)と見なされ、下半分は正(00000-49999)と見なされます。結果として、上位の桁が5〜9の場合は、表される数値が負であることを意味し、0〜4の場合は、表されるものが正であることを意味します。

これを理解するのも私には困難でした。それを手に入れて本の記事と説明を読み直したところ(当時インターネットはありませんでした)、それを説明している人の多くは実際には理解していないことがわかりました。その後、アセンブリ言語を教える本を書きました(10年間は​​かなり売れました)。


5

2つの補数は、指定された数値の1の補数に1を加えることでわかります。2の補数を10101見つけて、その1の補数を見つける必要があるとしましょう。つまり、この結果に01010追加101010+1=01011ます。つまり、これが最終的な答えです。


4

8ビットを使用して、バイナリ形式で10 – 12の答えを取得できます。実際に実行するのは10 +(-12)です。

12の補数部分を10から減算する必要があります。バイナリの12は00001100です。バイナリの10は00001010です。

12の補数部分を取得するには、すべてのビットを反転してから1を追加します。2進数で反転した12は11110011です。これは逆コード(1の補数)でもあります。ここで1つ追加する必要があります。現在は11110100です。

したがって、11110100は12の賛辞です。このように考えると簡単です。

これで、上記の10〜12の質問をバイナリ形式で解決できます。

00001010
11110100
-----------------
11111110  

3

2の補数:数値の1の補数で1を追加すると、2の補数が得られます。例:100101 1の補数は011010、2の補数は011010 + 1 = 011011(1の補数で1を追加することにより)詳細については、 この記事でグラフで説明します。


plus1は、円で説明されているリンク
Manohar Reddy Poreddy、2015

3

数学の観点から2の補体系を見ると、それは本当に理にかなっています。10の補数で、アイデアは本質的に違いを「分離」することです。

例:63-24 = x

24の補数を追加しますが、これは実際にはちょうど(100-24)です。したがって、実際には、方程式の両側に100を加えるだけです。

これで方程式は100 + 63-24 = x + 100になります。そのため、100(または10または1000など)を削除します。

ゼロの長いチェーンから1つの数値を減算する必要があるという不都合な状況のため、10進法では9の補数である「基数補数の減少」システムを使用します。

ナインの大きな連鎖から差し引かれた数が表示されたら、数を逆にするだけです。

例:99999-03275 = 96724

それが理由で、9の補数の後に1を追加します。おそらく子供時代の数学からわかるように、9は「盗む」1によって10になります。

Binaryでは、2の補数は10の補数と等しく、1の補数は9の補数です。主な違いは、10の累乗の差を分離しようとするのではなく(10、100などを方程式に加える)、2の累乗の差を分離しようとしていることです。

このため、ビットを反転します。被減数が10進数の9の連鎖であるのと同じように、被減数は2進数の1の連鎖です。

例:111111-101001 = 010110

1のチェーンは2のべき乗より1小さいため、9が10進数で行うように、差から1を「盗み」ます。

負の2進数を使用しているときは、次のように言っています。

0000-0101 = x

1111-0101 = 1010

1111 + 0000-0101 = x + 1111

xを「分離」するには、1111が10000から1離れているため、1を追加する必要があります。また、最初の1を元の差に追加したため、先頭の1を削除します。

1111 + 1 + 0000-0101 = x + 1111 + 1

10000 + 0000-0101 = x + 10000

xを取得するには、両側から10000を削除するだけです。これは基本的な代数です。


3

これまでの回答の多くは、2の補数が負の数を表すために使用されている理由をうまく説明していますが、2の補数が何であるか、特に「1」が追加された理由については教えず、実際には間違った方法で追加されていることがよくあります。

混乱は、補数の定義の理解が不十分なために生じます。補完は、何かを完全にする欠けている部分です。

基数bのn桁の数値xの基数補数は、定義上、b ^ nxです。バイナリでは、4は100で表され、3桁(n = 3)および基数2(b = 2)を持ちます。したがって、その基数の補数はb ^ nx = 2 ^ 3-4 = 8-4 = 4(または2進数で100)です。

ただし、バイナリでは、基数の補数を取得することは、(b ^ n-1)-yとして定義される、基数の補数よりも1だけ小さい、減少した基数の補数を取得するほど簡単ではありません。基数の補数を減らすには、すべての桁を反転させます。

100-> 011(減少した(1の)基数補数)

基数(2の)補数を取得するには、定義として1を追加するだけです。

011 +1-> 100(2の補数)。

今、この新しい理解で、Vincent Ramdhanie(上記の2番目の応答を参照)によって与えられた例を見てみましょう。

/ *ヴィンセントの始まり

1111を10進数に変換:

数値は1から始まるため、負なので、1111の補数である0000を見つけます。1を0000に加えて、0001を取得します。0001を10進数に変換します。これは1です。sign= -1を適用します。多田!

ヴィンセントの終わり* /

として理解する必要があります

番号は1から始まるため、負の数です。つまり、ある値xの2の補数であることがわかります。2の補数で表されるxを見つけるには、最初に1の補数を見つける必要があります。

xの2の補数:1111 xの1の補数:1111-1-> 1110; x = 0001、(すべての桁を反転)

記号-を適用し、答えは= -x = -1です。


3

補完という言葉は完全性に由来します。10進数の世界では、0〜9 の数字は、すべての10進数を表す数字または数値記号の補集合(完全なセット)を提供します。2進数の世界では、数字の0と1は、すべての2進数を表すために数の補数を提供します。実際、記号0と1は、すべて(テキスト、画像など)だけでなく、正(0)と負(1)を表すために使用する必要があります。私たちの世界では、numberの左側の空白はゼロと見なされます。

                  35=035=000000035.

コンピュータの保管場所には、空白スペースはありません。すべてのビット(2進数)は0または1のいずれかでなければなりません。メモリ番号を効率的に使用するために、8ビット、16ビット、32ビット、64ビット、128ビット表現として保存できます。8ビットの数値として格納されている数値を16ビットの場所に転送する場合、符号と絶対値(絶対値)は同じままにする必要があります。1の補数と2の補数表現の両方がこれを容易にします。名詞として:1の補数と2の補数はどちらも、最上位ビット(左側にあるビット)が符号ビットである符号付き数量のバイナリ表現です。0は正、1は負です。 2の補数は負の意味ではありません。符号付き数量を意味します。10進数と同様に、マグニチュードは正の量として表されます。構造体は符号拡張を使用して、より多くのビットを持つレジスタ[]に昇格するときに数量を保持します。

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

動詞として:2の補数は否定すること意味ます。ネガティブにするという意味ではありません。負が正になるかどうかを意味します。正なら負にする。マグニチュードは絶対値です。

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

この機能により、negate then addを使用した効率的なバイナリ減算が可能になります。a-b = a +(-b)

1の補数を取る公式な方法は、各桁でその値を1から減算することです。

        1'scomp(0101) = 1010.

これは、各ビットを個別に反転または反転することと同じです。これは、あまり愛されていない負のゼロになるため、1の補数に1を追加すると問題が解決します。2の補数を無効にする、または取るには、最初に1の補数を取り、次に1を追加します。

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

例では、否定は符号拡張数でも機能します。

追加:
1110キャリー111110キャリー0110は000110と同じ1111 111111合計0101合計000101

抽出:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

2の補数を処理する場合、数値の左側の空白は、正の数の場合はゼロで埋められ、負の数の場合は1で埋められることに注意してください。キャリーは常に追加され、1または0でなければなりません。

乾杯


3

2の補数は、本質的に2進数の加法逆数を考え出す方法です。これを自問してみてください:バイナリ形式の数値が与えられた場合、元の数値に追加されると、結果をゼロにするビットパターンは何ですか?このビットパターンを思い付くことができる場合、そのビットパターンは元の数値の-ve表現(加算逆)です。定義上、加法逆数に数値を追加すると常にゼロになります。例:10進数の5である101を取ります。ここでのタスクは、ビットパターン(101)に追加するとゼロになるビットパターンを考え出すことです。それを行うには、101の最も右側のビットから開始し、個々のビットごとに同じ質問を繰り返します。結果をゼロにするには、「この」ビットにどのビットを追加すればよいですか。通常のキャリーオーバーを考慮してそれを続けます。最も右側の3桁(先行ゼロに関係なく元の数を定義する桁)を処理した後、最後のキャリーは加算の逆のビットパターンになります。さらに、元の数値を1バイトで保持することができるため、加算インバースの他のすべての先行ビットも1である必要があります。これにより、コンピュータが「その」ストレージタイプを使用して数値とその加算インバースを追加するとき(char)その文字の結果はすべてゼロになります。

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

2

私はラビニオの答えが好きでしたが、ビットをシフトすると多少複雑になります。多くの場合、符号ビットを考慮しながらビットを移動するか、符号ビットを考慮せずにビットを移動するかの選択肢があります。これは、数値を符号付き(ニブルの場合は-8〜7、バイトの場合は-128〜127)として処理するか、フルレンジの符号なしの数値(ニブルの場合は0〜15、バイトの場合は0〜255)として処理するかの選択です。


2

これは、データ型のビットの組み合わせの約半分が負の整数用に予約され、対応する正の整数とほとんどの負の整数を加算するとキャリーオーバーフローが発生するような方法で負の整数をエンコードする賢い手段です。結果はバイナリゼロのままになります。

したがって、2の補数で、1が0x0001の場合、-1は0x1111になります。これは、合計が0x0000になるためです(オーバーフローは1)。


1

2の補数は負の数を表す方法の1つであり、ほとんどのコントローラーとプロセッサーは負の数を2の補数形式で格納します


1
これは、他の回答によって提供される情報に何も追加しません。
Adrian Mole

1

2の補数は主に次の理由で使用されます。

  1. 0の複数の表現を回避するには
  2. オーバーフローの場合にキャリービット(1の補数など)を追跡しないようにするため。
  3. 足し算や引き算などの簡単な操作が簡単になります。

0

参照:https : //www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

すべてのビットを反転して1を追加します。プログラムで:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

アセンブラでさえ高すぎるでしょう。追加ロジックのゲートレベルの回路図を確認する必要があります。Tサイクルあり。あなたはアルゴリズム的に正しいです。
mckenzm 2017

0

与えられた数の2の補数はnoです。noの1の補数で1を追加することで得られます。バイナリ番号があると仮定します。101110011011の補数は01000110010で、2の補数は01000110011になります。


0

数値をビット単位で補うには、その中のすべてのビットを反転します。2を補うために、すべてのビットを反転して1を追加します。

符号付き整数に2の補数表現を使用して、2の補数演算を適用して、正の数を負の等価数に、またはその逆に変換します。したがって、例としてニブルを使用すると、0001(1)は1111(-1)になり、opを再度適用すると、0001

ゼロでの操作の動作は、正と負のゼロを特別に処理せずに、ゼロの単一の表現を与えるのに有利です。0000を補完し1111、1を追加します。にオーバーフローし0000、正と負の値ではなく、1つのゼロを与えます。

この表現の主な利点は、符号なし整数の標準加算回路に適用すると、正しい結果が生成されることです。たとえば、ニブルに1と-1を追加すると0001 + 1111、ビットはレジスターからオーバーフローし、残ります。0000ます。

穏やかな紹介のために、すばらしいComputerphileがこのテーマに関するビデオを作成しました


0

簡単に言えば 2's Complement言えば、コンピュータメモリに負の数を格納する方法です。一方、正の数は通常の2進数として格納されます。

この例を考えてみましょう。

コンピューターはBinary Number System任意の数を表すために使用します。

x = 5;

これはとして表され0101ます。

x = -5;

コンピュータエンコーターが-署名すると、2の補数が計算されて保存されます。 i.e5 = 0101であり、2の補数は1011です。

コンピュータが数値を処理するために使用する重要なルールは、

  1. 最初のビットが数値の場合、1それはnegative数値でなければなりません。
  2. 最初のビットを除くすべてのビット0が正の数である場合、それは正の数-0です(1000 is not -0代わりに正です8)。
  3. すべてのビットがそうであれば0、それは0です。
  4. そうでなければ、それはpositive numberです。


-6

最も簡単な答え:

1111 + 1 =(1)0000。したがって、1111は-1でなければなりません。次に-1 + 1 = 0です。

これらをすべて理解するのは完璧です。


これは質問に対する答えを提供しません。批評したり、著者に説明を要求するには、投稿の下にコメントを残してください。
コドール

それが答えです。もっとも単純な。私にとって-最高のもの。
ドミトリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.