負の整数を含む足し算

2の補数を使うと引き算が足し算でできるようになります。

2の補数で表されたマイナスの数を普通に足せば引き算になります。

ただし、計算結果が符号つき整数で表せる範囲を越えると正しい答えになりません。

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

内部表現 符号つき整数
(2の補数)
0 0 0 0 0
+) 0 0 0 0 0
加算実行 計算値 正しい値

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

もう少し大きな数を扱いたいときは8ビットを見てください。

結果の表です。

コンピュータの
内部表現
計算値 正しい値
1110-214
1101-313
1100-412
1011-511
1010-610
1001-79
1000-88
011177
011066
010155
010044
001133
001022
000111
000000
1111-1-1
1110-2-2
1101-3-3
1100-4-4
1011-5-5
1010-6-6
1001-7-7
1000-8-8
01117-9
01106-10
01015-11
01004-12
00113-13
00102-14
00011-15
00000-16

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

C言語

#include <stdio.h>
int main()
{
      int a = 2147483647;
      int h = a/2;
      int d = h + h;
      printf("%d\n",a);
      printf("%d\n",h);
      printf("%d\n",d);
      printf("%d\n",d+1);
      printf("%d\n",d+2);
      
      return 0;
}

実行結果

adachi@star00:~$ gcc Inttsst.c -o Inttest
adachi@star00:~$ ./Inttest 
2147483647
1073741823
2147483646
2147483647
-2147483648

Java

public class IntTsst { 
   public static void main( String[] args ) {
      int a = 2147483647;
      int h = a/2;
      int d = h + h;
      System.out.println(a);
      System.out.println(h);
      System.out.println(d);
      System.out.println(d+1);
      System.out.println(d+2);
   } 
}

実行結果

adachi@star00:~/java$ javac IntTsst.java 
adachi@star00:~/java$ java IntTsst 
2147483647
1073741823
2147483646
2147483647
-2147483648
聖愛中学高等学校
http://www.seiai.ed.jp/
Jun. 2011