2の補数
テンプレート:読み仮名は、テンプレート:Math を位取り記数法の基数とした場合の基数の補数であるテンプレート:Sfnテンプレート:Sfnテンプレート:Sfnテンプレート:Sfnテンプレート:Sfnテンプレート:Sfnテンプレート:Efn2。すなわち、整数 テンプレート:Mvar との和が基数 テンプレート:Math の冪 テンプレート:Math となる数 テンプレート:Math2 のことをいうテンプレート:Efn2(例:テンプレート:Math2 について、テンプレート:Math に対応する2の補数は テンプレート:Math2)。
数 テンプレート:Mvar とその2の補数 テンプレート:Math を二進法で表せば、2の補数 テンプレート:Math は テンプレート:Mvar との和が テンプレート:Math2 桁に繰り上がる最小の数といえる(例:テンプレート:Math2 についてテンプレート:Efn2、テンプレート:Math2 に対応する2の補数は テンプレート:Math2)。
2の補数を得る手順は、基数の補数および減基数の補数の定義から、1の補数に テンプレート:Math を足す操作となる。1の補数は二進表示された数の各位の値(ビット)を テンプレート:Math から テンプレート:Math、また テンプレート:Math から テンプレート:Math に置き換える操作(ビット反転)によって得られるため(例:テンプレート:Math2)、2の補数はしばしば元の数をビット反転して1を足したものとして定義される。
ある数の2の補数を反数と見なせば、二進法において決まった桁数を持った数をそれぞれ非負の数と負の数に対応づけられる(#負の数の表現)。 特に テンプレート:Mvar 桁の二進数について テンプレート:Math から テンプレート:Math(例:テンプレート:Math なら テンプレート:Math から テンプレート:Math)の範囲で符号なし表現と一致させたものはテンプレート:読み仮名またはテンプレート:読み仮名と呼ばれる(#2の補数表現)。
2の補数表現はコンピュータの分野において、固定長の符号付きの整数型や固定小数点数の表現に利用されている。
また2の補数表現は加算器で減算をするために使われる。
計算例
以下に#2の補数表現における計算例を示す。
補数であることの確認
例えば、4桁の二進数 テンプレート:Math2 に対する2の補数は テンプレート:Math である。実際、これらを足し算は以下のようになる:
結果は テンプレート:Math2 になっており、テンプレート:Math が テンプレート:Math の テンプレート:Math2 に対する補数になっていることが確かめられる。また5桁目以降を無視し下4桁だけ取り出せば、結果は テンプレート:Math となる。つまり、テンプレート:Math にその2の補数 テンプレート:Math を足すということは テンプレート:Math から テンプレート:Math 自身を引くということと同じ意味を持つ。言い換えれば、 テンプレート:Math2 は負数 テンプレート:Math を表している。
引き算と補数の足し算の比較
例えば、二進数 テンプレート:Math2 から二進数 テンプレート:Math2 を引く場合、以下のように計算できる:
一方、二進数 テンプレート:Math の2の補数 テンプレート:Math を足す計算は、以下のようになる:
5桁目以降を無視し下4桁を取り出せば、こちらも結果は テンプレート:Math2 になり、引き算の場合と一致する。また、テンプレート:Math は負数 テンプレート:Math を表していることが分かる。
算術オーバーフローの例
足し算の結果、算術オーバーフローが起きることがある。
例えば、二進数 テンプレート:Math2 と二進数 テンプレート:Math2 の足し算は以下のように計算できる:
結果は テンプレート:Math2 となるが、これは2の補数表現において負の整数 テンプレート:Math に対応し、通常の足し算で期待される結果 テンプレート:Math2 と一致しない。
同様に、二進数 テンプレート:Math2 と二進数 テンプレート:Math2 の足し算は期待する結果を与えない:
結果は テンプレート:Math2 となり、通常の足し算で期待される結果 テンプレート:Math2 と一致しない。
負の数の表現
2の補数を用いて、二進法で表された数(二進数)を負の整数に対応づけられる。2の補数の定義より、テンプレート:Mvar 桁テンプレート:Efn2の二進数 テンプレート:Mvar とその補数 テンプレート:Math は以下の関係を満たすテンプレート:Sfn:
冪 テンプレート:Math の倍数を テンプレート:Math と同一視すれば、上記の補数の関係は テンプレート:Math を法とする合同式に置き換えられるテンプレート:Sfn:
これは テンプレート:Mvar の補数 テンプレート:Math を テンプレート:Mvar の反数 テンプレート:Math と見なすことを意味する。すなわち、数 テンプレート:Mvar から テンプレート:Mvar を引く操作は、数 テンプレート:Mvar と補数 テンプレート:Math のたし算に置き換えられるテンプレート:Sfnテンプレート:Sfn:
同様に反数 テンプレート:Math のかけ算は補数の積に置き換えられるテンプレート:Sfn:
#負の数の表現節の方法で負の数の計算を行えるが、具体的な数値計算を行うには、どの二進数(ビット列)がどの数値を表すかという対応関係を定義しなければならない。テンプレート:Math から テンプレート:Math までの非負整数をそのまま通常の位取り記数法における二進表示、
に対応づければ、これらの数の補数として負の整数に対する2の補数表現が得られる:
具体例として、テンプレート:Math 桁テンプレート:Efn2の二進数における対応表を示す:
| 対応する数値 | 二進数 | 対応する数値 | 二進数 |
|---|---|---|---|
| テンプレート:Math | テンプレート:Math | - | - |
| テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| - | - | テンプレート:Math | テンプレート:Math |
結局、テンプレート:Mvar 桁の二進数の テンプレート:Math 桁目の値を テンプレート:Math とすれば、2の補数表現は以下のように表せるテンプレート:Sfn:
最上位ビット テンプレート:Math はテンプレート:読み仮名と呼ばれ、数値の正負を決定する。すなわち、符号ビットが テンプレート:Math なら非負の数値を表し、テンプレート:Math なら負の数値を表す。
上記の数の補数は、以下のように表せる:
等比数列の和 を用いれば、上記の補数は以下のようにも表せるテンプレート:Sfn:
これは結局、元の数に負符号を付けた形となっている(ただし元の数が テンプレート:Math の場合は算術オーバーフローが発生する。オーバーフローをチェックせずラップアラウンドする場合、テンプレート:Math 自身へ写るテンプレート:Efn2)。
2の補数表現の性質
符号なし整数との一致
2の補数表現は、符号ビットが テンプレート:Math なら符号なし整数表現(つまり通常の二進法)に一致するテンプレート:Sfn。この性質は符号・絶対値表現や1の補数表現も持っている。
最小値と最大値の非対称性
2の補数表現において、テンプレート:Mvar 桁(テンプレート:Mvar 個のビット)の二進数で表せる数値の範囲は テンプレート:Math2 から テンプレート:Math2 までであるテンプレート:Sfn(例: テンプレート:Math2 の場合、テンプレート:Math2 から テンプレート:Math2)。最小値と最大値の絶対値を比較すると、負の数の範囲は正の数の範囲に対して テンプレート:Math だけ大きく、非対称になっている。そのため、最小値の補数を求めようとすると算術オーバーフローが生じる(汎整数拡張によって型が格上げされる場合は除く)。この性質は符号・絶対値表現や1の補数表現にはなく、符号・絶対値表現および1の補数表現での数値の範囲は テンプレート:Math2 から テンプレート:Math2 までと対称的になっている。
偶奇性の判定
2の補数表現において、整数の偶奇性を判定するには最下位の桁(最下位ビット)が偶数か奇数かを判定すればよい。すなわち二進数表示の最下位の値 テンプレート:Math が テンプレート:Math なら偶数であり テンプレート:Math なら奇数であることが示せるテンプレート:Sfn。同じ性質は符号・絶対値表現も持つが、1の補数表現においては最上位の桁(最上位ビット)の検査が必要であり、最上位ビットが テンプレート:Math なら最下位ビットが テンプレート:Math、最上位ビットが テンプレート:Math なら最下位ビットが テンプレート:Math の場合に偶数となる。
正負の判定
2の補数で表される数は、符号ビット(最上位ビット) テンプレート:Math が テンプレート:Math なら非負の値を取り テンプレート:Math なら負の値を取るテンプレート:Sfn。すなわち、負値か非負値かの判定は符号ビットのみから判別できる。符号・絶対値表現や1の補数表現ではゼロを表す二進数が一意でなく、符号ビットが テンプレート:Math の テンプレート:Math と符号ビットが テンプレート:Math の テンプレート:Math があるため、テンプレート:Math が許容される限り、これらの表現では符号ビットのみから負数か非負数かを判定できない。
1の補数との関係
2の補数表現において、テンプレート:Math は常にすべての位の値が テンプレート:Math の二進数 テンプレート:Math に対応づけられる。従って、数をビット列とみなせば、ビット列 テンプレート:Mvar とそのビットを反転テンプレート:Efn2させたビット列 テンプレート:Math は常に以下を満たす:
上記より、テンプレート:Mvar の2の補数は テンプレート:Math と表せる。従って減法は、
と書き換えられる。ビット反転はまた1の補数を得る操作でもある。
右辺の テンプレート:Math2 は テンプレート:Mvar に対する1の補数そのものであるから、ビット反転は1の補数を得る操作になっている。
元の数とのビットの一致
テンプレート:Mvar の テンプレート:Mvar 桁の二進数表示の下位 テンプレート:Math2 桁目まで位の値が テンプレート:Math だった場合、2の補数 テンプレート:Math2 を求める際、ビット反転した値が桁上りによって再び反転するため、下位 テンプレート:Math2テンプレート:Efn2桁まで元の数とその2の補数の値が一致する。また残りの上位 テンプレート:Math2 桁は、ビット反転 テンプレート:Math の上位 テンプレート:Math2 桁に一致する。例えば、補数と元の数の位の値が一致する部分に下線を引けば、テンプレート:Math のビット反転は テンプレート:Math2 であり、2の補数は テンプレート:Math2 となる。同様に、テンプレート:Math および テンプレート:Math のビット反転はそれぞれ テンプレート:Math, テンプレート:Math であり、2の補数はそれぞれ テンプレート:Math, テンプレート:Math となる(表も参照)。
| 元の数と一致する下位ビットの桁数(テンプレート:Mvar) | 1 | 2 | 3 | 4 | 4 |
|---|---|---|---|---|---|
| 元の数(テンプレート:Mvar) | テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| ビット反転(テンプレート:Math) | テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
| 2の補数(テンプレート:Math) | テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math | テンプレート:Math |
脚注
注釈
出典
参考文献
- テンプレート:Cite book
- テンプレート:Cite book
- テンプレート:Cite book
- テンプレート:Cite web2
- テンプレート:Cite web2
- テンプレート:Cite web2
- テンプレート:Cite web2
- テンプレート:Cite web2
- テンプレート:Cite web2
- テンプレート:Cite web2