二進数の足し算(8ビット)

2進数の足し算はとても単純です。10進数との違いは 1 + 1 で繰り上がるということだけです。

0 1
0 0 1
1 1 10

コンピュータ内部で整数を何ビットで計算するかは目的により様々ですが、普通32ビットを使い、必要があれば64ビットあるいは128ビットで扱うこともあります。計算結果がこのビット数を越えると正しい答えになりません。

8ビットでは計算結果が 0 以上 255 以下ならば正しい答が出ます。

内部表現 符号なし整数
(十進数)
0 0 0 0 0 0 0 0 0
+) 0 0 0 0 0 0 0 0 0
加算実行 計算値 正しい値

内部表現のビットをクリックして数値を設定し、[加算実行]で和を求めます。

結果の表です。

コンピュータの
内部表現
計算値 正しい値
11111010250250
11111011251251
11111100252252
11111101253253
11111110254254
11111111255255
1000000000256
1000000011257
1000000102258
1000000113259
1000001004260
1000001015261
1000001106262
1000001117263
1000010008264
1000010019265

以下は参考:実際のプログラム言語でも

C言語

このgccは unsigned int と宣言すると4バイトの符号なし整数として扱います。32ビットがすべて1である2進数は 4294967295 ですが、代入前に符号つき整数として扱えない数値だと警告されるので、16進数で 0xffffffff と書いています。

0x が16進数を表し、ff が1バイト分の 11111111 を表しています。

#include 
int main()
{
      unsigned int a = 0xffffffff;
      unsigned int b = a + a;
      printf("%u\n",a);
      printf("%u\n",a+1);
      printf("%u\n",a+2);
      printf("%u\n",a+3);
      printf("%u\n",b);
      
      return 0;
}

実行結果

adachi@dirac:~/c$ gcc unsignedtest.c -o unsignedtest
adachi@dirac:~/c$ ./unsignedtest 
4294967295
0
1
2
4294967294

4294967295 が符号なし整数の限界ですから、それに1を足すと 0 になってしまいます。

これは4ビットの符号なし整数の限界が 15 でそれに1を足すと 0 になってしまうのと同じです。

実際のプログラムではこのようなことがないように対策をたてます。

上記のリテラルの扱い(代入前に符号つき整数に対する)についての警告は以下のようなもの。

unsignedtest.c:4: warning: this decimal constant is unsigned only in ISO C90
聖愛中学高等学校
http://www.seiai.ed.jp/
Jun. 2011