Complément à deux
standardAdopté 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
Relatifs, codage −x, overflow
Adopté par x86, ARM, RISC-V ; une seule addition pour signés et non signés.
Résultat hors plage → cycle sur n bits.
Signe-magnitude : double zéro et circuits séparés : abandonné en pratique.
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)
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
Signe-magnitude : MSB = signe, mais double 0 et addition complexe.
Python : pas d'overflow sur int ; attention en C/Java.