Java | 2の補数を図で丁寧に説明(負の数がどう表現されるか)

Java Java
スポンサーリンク

では 2の補数(two’s complement) を図で丁寧に説明して、Javaの負の数の扱いが理解できるように解説します。初心者向けに、段階的にわかりやすく進めます。


1. 正の整数の二進数表現

まずは普通の正の数です。
Javaの int32ビット ですが、わかりやすく 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ビットで表す

  1. 5を二進数にする
5 = 0000 0101
  1. すべてのビットを反転(1の補数)
1111 1010
  1. 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ビット)コメント
50000 0101正の数
-51111 1011反転して+1
10000 0001正の数
-11111 1111反転して+1
00000 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ではビット演算やシフトでも負の数が自然に扱えます。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました