2の補数を使うと引き算が足し算でできるようになります。
2の補数で表されたマイナスの数を普通に足せば引き算になります。
ただし、計算結果が符号つき整数で表せる範囲を越えると正しい答えになりません。
4ビットでは計算結果が -8 以上 7 以下ならば正しい答えが出ます。
| 内部表現 | 符号つき整数 (2の補数) |
|||||
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | ||
| +) | 0 | 0 | 0 | 0 | 0 | |
| 加算実行 | 計算値 | 正しい値 | ||||
内部表現のビットをクリックして数値を設定し、[加算実行]で和を求めます。
もう少し大きな数を扱いたいときは8ビットを見てください。
結果の表です。
| コンピュータの 内部表現 |
計算値 | 正しい値 |
|---|---|---|
| 1110 | -2 | 14 |
| 1101 | -3 | 13 |
| 1100 | -4 | 12 |
| 1011 | -5 | 11 |
| 1010 | -6 | 10 |
| 1001 | -7 | 9 |
| 1000 | -8 | 8 |
| 0111 | 7 | 7 |
| 0110 | 6 | 6 |
| 0101 | 5 | 5 |
| 0100 | 4 | 4 |
| 0011 | 3 | 3 |
| 0010 | 2 | 2 |
| 0001 | 1 | 1 |
| 0000 | 0 | 0 |
| 1111 | -1 | -1 |
| 1110 | -2 | -2 |
| 1101 | -3 | -3 |
| 1100 | -4 | -4 |
| 1011 | -5 | -5 |
| 1010 | -6 | -6 |
| 1001 | -7 | -7 |
| 1000 | -8 | -8 |
| 0111 | 7 | -9 |
| 0110 | 6 | -10 |
| 0101 | 5 | -11 |
| 0100 | 4 | -12 |
| 0011 | 3 | -13 |
| 0010 | 2 | -14 |
| 0001 | 1 | -15 |
| 0000 | 0 | -16 |
#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
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聖愛中学高等学校