補数について

最終更新日:2004-06-27.

今回は、補数についてちょっと。

・補数

ここにある数があるとします。
それが最大の数になるために必要な数のことをいいます。
10進数のときの最大の数として、同じ桁内の最大の数といえば9ですね。
また、その桁がいっぱいになって一つ上の桁にあがった10も最大と
見ることができます。
このように、補数には二つあるとのこと。

例えば、ここに10進数の7があるとします。
その補数は以下のようになります。
9の補数は2ですね。
そして、10の補数は3です。

次に、2進数の場合を考えてみましょう。

ここに00000001という2進数があるとします。
このとき、1の補数は11111110ですね。
すべてのビットを反転させれば求められます。
そして、2の補数は11111111です。
これは、すべてのビットを反転させてから1を加えます。

上記の2進数を10進数で表現すると、
00000001は+1、11111110は-2、11111111は-1ですね。

これにより、絶対値を求める場合は2の補数を使用します。

符号付きの数において、そのビットパターンでの最上位ビット(左端)の
ビットは符号ビットです。
符号ビットが0ならば正の数、1ならば負の数です。
そして、残りのビットを見て10進数への変換などもできます。

では、ソースにしてみましょう。
+------------------------------------------------------------+
/* filename=no024-1.c */
/* include */
#include <stdio.h>
/* 関数プロトタイプ宣言 */
void sub(char);
/* main */
int main( )
{
/* 符号付き */
signed char a, b, c;
a=2;
b=-1;
/* ビット反転 */
c=a^b;
sub(a);
printf(", %d\n", a);
sub(c);
printf(", %d 1の補数\n", c);
c++;
sub(c);
printf(", %d 2の補数\n", c);
return 0;/* 終了 */
}
void sub(char i)
{
char j=128;
char k;
while( j ){
k=i&j;
if( k>0 )
k=1;
printf("%d", k);
j=(j>>1);
}
return;/* 戻る */
}
+------------------------------------------------------------+

上記をコンパイルして実行すると、以下のように表示されました。
00000010, 2
11111101, -3 1の補数
11111110, -2 2の補数

戻る