Adloun

Écrire additionne c2(s, t) , qui additionne deux codages en complément…

Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 1 — Représenter les entiers · Calculer en complément à deux

Énoncé

Écrire additionne_c2(s, t), qui additionne deux codages en complément à deux de même longueur et renvoie le couple (codage de la somme, débordement), le second étant un booléen. Indication : il y a débordement exactement lorsque les deux opérandes ont le même bit de signe et que le résultat en a un autre. Valider exhaustivement sur puis bits.

Corrigé

Pourquoi ce critère. Additionner un positif et un négatif ne peut pas déborder : le résultat est compris entre les deux opérandes, donc dans l'intervalle. Le débordement ne peut donc survenir que si les deux signes coïncident — et il se manifeste alors par un résultat de signe opposé, puisque la somme « repasse de l'autre côté » du cercle des configurations.


def additionne_c2(s, t):
    """Somme de deux codages en complément à 2 de même longueur.

    Renvoie (codage de la somme, débordement), où débordement
    est un booléen. Précondition : len(s) == len(t).
    """
    assert len(s) == len(t)
    n = len(s)
    res = addition_base(s, t, 2)[-n:]
    deborde = (s[0] == t[0]) and (res[0] != s[0])
    return res, deborde

Validation exhaustive — on compare au calcul exact fait par Python :


for n in (4, 8):
    lo, hi = -2**(n - 1), 2**(n - 1) - 1
    for x in range(lo, hi + 1):
        for y in range(lo, hi + 1):
            res, deb = additionne_c2(complement_a_2(x, n),
                                     complement_a_2(y, n))
            assert deb == (not lo <= x + y <= hi)
            if not deb:
                assert depuis_complement_a_2(res) == x + y

Les cas passent : le critère est donc exact, pas seulement plausible.

Contrôle : additionne_c2(c(60), c(-100)) rend (&quot;11011000&quot;, False) et additionne_c2(c(70), c(70)) rend (&quot;10001100&quot;, True) — les deux exercices de TD, retrouvés automatiquement.

Piège : croire que la retenue sortante signale le débordement. Elle ne le signale pas : dans il n'y a pas de retenue sortante et pas de débordement, mais dans il y a une retenue sortante et aucun débordement.

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.