では 2の補数(two’s complement) を図で丁寧に説明して、Javaの負の数の扱いが理解できるように解説します。初心者向けに、段階的にわかりやすく進めます。
1. 正の整数の二進数表現
まずは普通の正の数です。
Javaの int は 32ビット ですが、わかりやすく 8ビット で例を示します。
例:5 を8ビットで表すと:
5 = 0000 0101
- 左端(最上位ビット)を 符号ビット と呼ぶことがあります。
- 0 → 正の数、1 → 負の数(2の補数表現のとき)。
2. 1の補数(参考:反転するだけ)
負の数を作るときのステップとして「まず反転」を考えると理解しやすいです。
例:5 の1の補数(0/1を反転):
5 = 0000 0101
反転 → 1111 1010
- これを 1の補数 と呼ぶ
- でもJavaは2の補数を使うのでさらにステップがあります
3. 2の補数(負の数の正式な表現)
ルール:正の数を反転して、1を足す
例:-5 を8ビットで表す
- 5を二進数にする
5 = 0000 0101
- すべてのビットを反転(1の補数)
1111 1010
- 1を足す(+1)
1111 1010
+ 1
---------
1111 1011
これが -5 の8ビット2の補数表現です。
ポイント:最上位ビットが 1 → 負の数
正の数は最上位ビット 0
4. 足し算で確認(2の補数の強み)
2の補数を使うと、符号を意識せずに足し算ができます。
例:5 + (-5) を計算
5 = 0000 0101
-5 = 1111 1011
足すと → 10000 0000 (9ビット目は無視)
結果 = 0000 0000 → 0 になる
- 自然に計算できる
- 符号を別で考えなくていい → CPUが高速に計算できる
5. 8ビットでの図まとめ
| 数値 | 2進数(8ビット) | コメント |
|---|---|---|
| 5 | 0000 0101 | 正の数 |
| -5 | 1111 1011 | 反転して+1 |
| 1 | 0000 0001 | 正の数 |
| -1 | 1111 1111 | 反転して+1 |
| 0 | 0000 0000 | 特殊:0はそのまま |
6. Javaで確認するサンプルコード
public class TwosComplement {
public static void main(String[] args) {
int a = 5;
int b = -5;
System.out.println("5 in binary: " + Integer.toBinaryString(a));
System.out.println("-5 in binary: " + Integer.toBinaryString(b));
int sum = a + b;
System.out.println("5 + (-5) = " + sum);
}
}
Java出力例(32ビット):
5 in binary: 101
-5 in binary: 11111111111111111111111111111011
5 + (-5) = 0
- 32ビットで
-5は左端が1 → 負の数 - 足すと0になるのが確認できる
7. 視覚的まとめ(8ビットイメージ)
5 = 0000 0101
-5 = 1111 1011 (反転して1足す)
+5 = 0000 0101
----------------
0 = 0000 0000
この仕組みがあるので、Javaではビット演算やシフトでも負の数が自然に扱えます。
