Adloun

Écrire plus n bits(x, y, n) , qui simule en Python l'addition signée…

Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 1 — Représenter les entiers · Quand la taille des mots fait des dégâts

Énoncé

Écrire plus_n_bits(x, y, n), qui simule en Python l'addition signée d'une machine à bits — avec repli. Vérifier que donne sur bits, que donne , que donne , et que donne sur bits.

Corrigé


def plus_n_bits(x, y, n):
    """Somme de x et y dans l'arithmétique signée sur n bits."""
    s = (x + y) % 2**n
    if s >= 2**(n - 1):
        s = s - 2**n
    return s

assert plus_n_bits(127, 1, 8) == -128
assert plus_n_bits(100, 100, 8) == -56
assert plus_n_bits(-128, -1, 8) == 127
assert plus_n_bits(32767, 1, 16) == -32768

Les quatre assertions passent.

Pourquoi deux lignes suffisent. Tout le complément à deux tient dans le calcul modulo suivi d'une relecture : réalise la perte de la retenue sortante, et le test sur réalise la lecture du bit de poids fort. On n'a jamais eu besoin de manipuler des chaînes de bits.

Ce que la simulation montre. Ajouter au plus grand entier donne le plus petit : les configurations forment un cercle, pas une droite. Retirer au plus petit donne le plus grand — le même cercle, parcouru à l'envers.

Prolongement : Python protège des débordements sur les entiers, mais pas du tout sur les flottants (chapitre suivant), ni lorsqu'on écrit des données dans un fichier ou sur un réseau, où la taille des mots est imposée.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.