C規格は、負の符号付き数値を表す特定の方法を義務付けていません。
遭遇する可能性のあるほとんどの実装では、負の符号付き整数は2の補数と呼ばれるものに格納されます。負の符号付き数値を格納する他の主要な方法は、補数と呼ばれます。
Nビット数の2の補数はx
と定義され2^N - x
ます。たとえば、8ビットの2の補数1
は2^8 - 1
、または1111 1111
です。8ビットの2の補数で8
あり2^8 - 8
、バイナリです、1111 1000
。これは、ビットを反転してx
追加することによって計算することもできます。例えば:
1 = 0000 0001
~1 = 1111 1110
~1 + 1 = 1111 1111
-1 = 1111 1111
21 = 0001 0101
~21 = 1110 1010
~21 + 1 = 1110 1011
-21 = 1110 1011
Nビット数xの補数は、基本的にすべてのビットが反転したxとして定義されます。
1 = 0000 0001
-1 = 1111 1110
21 = 0001 0101
-21 = 1110 1010
2の補数には、1の補数に対するいくつかの利点があります。たとえば、「負のゼロ」という概念はありませんが、これは正当な理由で多くの人を混乱させます。加算、乗算、減算は、符号なし整数でも同様に、2の補数で実装された符号付き整数でも同じように機能します。