私が見たほとんどの説明と同様に、上記のものは2の補数を処理する方法については明確ですが、それらが数学的に何であるかを実際には説明しません。少なくとも整数については、そうするようにします。最初におそらくおなじみの背景について説明します。
10進数の場合の動作を思い出してください
。2345
は
2 ×10 3 + 3 ×10 2 + 4 ×10 1 + 5 ×10 0と書く方法です。
同様に、バイナリは、同じ一般的な考え方に従って0と1だけを使用して数値を書き込む方法ですが、上記の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を補完して追加することで正数を形成しようとすると、同じ負数が返されることです。ゼロがこれを行うのは当然のようですが、これは予想外のことであり、私たちが慣れている動作とはまったく異なります。コンピュータを除いて、通常、この固定長の計算ではなく、無制限の数字の供給を考えるからです。
これは奇妙な氷山の一角のようなものです。水面下ではさらに多くの嘘が待ち構えていますが、この議論にはそれで十分です。固定小数点演算の「オーバーフロー」を調べれば、おそらくもっと多くを見つけることができます。あなたが本当にそれに入りたいなら、あなたはまた「モジュラー算術」を研究するかもしれません。