手を上げるチップくんゆるふわ半導体
考え中のチップくん

2進数と2の補数をPythonで理解する|コンピュータが負の数を扱うしくみ

2026-09-14実践

#2進数#2の補数#ビット演算#Python#実践

コンピュータの中身は0と1だけ。その2進数で、どうやって負の数や引き算を扱うのでしょう? 鍵は 2の補数 という巧妙な表現です。この記事ではPythonで手を動かし、論理回路の土台になる数の表現を理解します。

準備

Python標準機能だけ。

① 2進数・16進数を行き来する

n = 42
print("2進:", bin(n))       # 0b101010
print("16進:", hex(n))      # 0x2a
print("戻す:", int("101010", 2), int("2a", 16))

# ビットごとに見る(8ビット表示)
print("ビット列:", format(n, "08b"))   # 00101010

② 2の補数:負の数の表し方

2の補数は「全ビット反転して1を足す」だけ。これで引き算が足し算になる魔法が生まれます。

def to_twos_complement(value, bits=8):
    if value < 0:
        value = (1 << bits) + value      # 2の補数表現に
    return format(value, f"0{bits}b")

print("+5:", to_twos_complement(5))     # 00000101
print("-5:", to_twos_complement(-5))    # 11111011

③ なぜ引き算が足し算で済むのか

7 - 5 を「7 + (-5の2の補数)」として計算してみます。

def add8(a, b):
    return (a + b) & 0xFF                # 8ビットに収める(あふれは捨てる)

a = 7
b = (1 << 8) - 5          # -5 の2の補数 = 251
result = add8(a, b)
print("7 + (-5) =", result, "→ 符号付きで", result - 256 if result > 127 else result)

出力は 7 + (-5) = 2足し算回路(加算器)だけで引き算ができる——だからCPUは引き算専用の回路を持たなくて済むのです。2の補数の最大の利点です。

🌱

なぜ全ビット反転+1?

2の補数は「その数を足すと桁あふれして0になる数」。5 + (-5) が8ビットで256=0になるように作られています。だから足すだけで引き算になる。ハードウェアを単純にする、実に美しい発明です。

⚠️

オーバーフローに注意

8ビットで表せるのは −128〜127。127 に 1 を足すと −128 になってしまいます(あふれ)。& 0xFF で桁を捨てているのがその現れ。整数の範囲を超えると値が壊れる——組み込みや低レイヤでは常に意識すべき落とし穴です。

まとめ

  • コンピュータは2進数。bin/hex/intで相互変換できる
  • 2の補数は「全ビット反転+1」で負の数を表す
  • おかげで引き算が足し算(加算器)だけで実現できる
  • 表現できる範囲を超えるとオーバーフローで値が壊れる

もう少し詳しく(背景と理論)

コンピュータが2進数を使うのは、電圧の高/低という2状態が最も確実に区別できるからです。各桁(ビット)は 2ⁿ の重みを持つ位取り記数法で、n ビットで 2ⁿ 通りを表せます1。負数の表現には2の補数が事実上の標準です——最上位ビットを符号に使いつつ、加算回路をそのまま流用でき、ゼロが一意になるという利点があります2。「情報の最小単位はビット」という考え方は Claude Shannon が1948年の情報理論で定式化しました3。16進数は2進数4桁をちょうど1桁に圧縮できるため、人が読み書きする際の橋渡しとして使われます。

次の一歩 🌸

足し算回路はNANDから全加算器、論理の基礎は論理回路のしくみ、ブール代数はブール代数をPythonでへどうぞ。

Footnotes

  1. 位取り記数法では各桁が基数のべき乗の重みを持つ。2進 n ビットは 0〜2ⁿ−1 の 2ⁿ 通りを表現する。

  2. 2の補数は「ビット反転して1を足す」で負数を作る。減算を加算で処理でき、符号付きゼロが生じない。現代CPUの整数表現の標準。

  3. Shannon, C. (1948). "A Mathematical Theory of Communication." ビットを情報の基本単位として定義し、情報理論を創始した。

あわせて読みたい