← Retour au cours Entiers

Complément à deux

standard

Adopté par x86, ARM, RISC-V ; une seule addition pour signés et non signés.

Coder −x
|x| en binaire → inverser les bits → +1
−5 sur 8 bits
1111 1011
Formule
code(−x) = 2^n − x
−1
Tous les bits à 1 sur n bits

Overflow

8 bits

Résultat hors plage → cycle sur n bits.

127 + 1 sur 8 bits signé
→ −128
−128 − 1
→ 127
Risque
Bugs silencieux, sécurité
C/Java/Rust
Comportement borné à surveiller
À retenir

Signe-magnitude : double zéro et circuits séparés : abandonné en pratique.

💻 Exemples de code

Complément à deux (idée Python)

complement_deux.py
def complement_a_deux(valeur_positive, nb_bits):
    """Code -valeur_positive sur nb_bits."""
    masque = (1 << nb_bits) - 1
    return ((~valeur_positive) + 1) & masque

print(complement_a_deux(5, 8))   # 251 (= -5 sur 8 bits)

Simulation overflow 8 bits signés

overflow.py
def addition_8_bits_signes(a, b):
    resultat = a + b
    if resultat > 127:
        resultat -= 256
    if resultat < -128:
        resultat += 256
    return resultat

print(addition_8_bits_signes(127, 1))   # -128

📋 Aide-mémoire

Signe-magnitude : MSB = signe, mais double 0 et addition complexe.

Python : pas d'overflow sur int ; attention en C/Java.