2の補数
2の補数(two’s complement)は、\(n\)桁の2進数\(x\)に対して、
\[x+x_c=2^n\]
の関係を満たす\(x_c\)のことである。故に、2の補数\(x_c\)は
\[x_c=2^n-x\]
と表すことができる。
データ表現
2の補数は、負数の表現に用いられる。
コンピュータの世界では、nビットのデータは2^nでオーバーフローするため、2の補数は
\[x_c=-x\ \mathrm{mod}\ 2^n\]
とみなすことができる。
また、上位1ビットを符号ビットとし、0のときは正の数、1のとき負の数を表すと定義することで、次の表のように負数を割り当てることができる。
decimal | octal | two’s complement (octal) | data |
---|---|---|---|
0 | 000 | 000 | 0 |
1 | 001 | 111 | 1 |
2 | 010 | 110 | 2 |
3 | 011 | 101 | 3 |
4 | 100 | 100 | -4 |
5 | 101 | 011 | -3 |
6 | 110 | 010 | -2 |
7 | 111 | 001 | -1 |
注意すべきは、正数の絶対値に比べて負数の絶対値が1大きくなることである。
例えば8ビットではunsignedの場合は0から256を表すが、signedの場合は-128から127となる。
2の補数を用いる利点
2の補数を用いることで、足し算のみで計算が可能になる。
\[y-x = y+x_c\ mod\ 2^n\]
負数の表現方法には、
- 符号・絶対値
- 1の補数
- 2の補数
などがあるが、現代では2の補数を用いた表現が最も一般的である。