Exercices

Chapitre 2: Représentation des entiers relatifs

1 Intervalles de valeurs

  1. En complément à deux, quel intervalle d’entiers relatifs peut-on représenter avec des mots de 8 bits? Combien de valeurs sont représentées?

  2. Même question avec des mots de 32 bits et 64 bits.

Informatique et sciences du numérique Spécialité ISN en terminale S - Avec des exercices corrigés et des idées de projets par Gilles Dowek

2 Coder sur 4 bits des entiers relatifs

Dans cet exercice, on utilise un codage en complément à 242^{4} sur 4 bits.

  1. Quels sont les nombres minimum et maximum que l’on peut représenter?

  2. Compléter le tableau suivant:

    Base 10 Complément à 2
    -8
    -1
    0
    3
    -5
    0111
    1001
    1100
  3. Réaliser les calculs suivants en binaire: 757-5 et 2×3-2\times 3.

3 Complément à 2 sur un octet

  1. Trouver la représentation binaire sur huit bits des entiers relatifs 00 et 128-128.

  2. Trouver la représentation décimale des entiers relatifs dont la représentation binaire sur huit bits est 0000 1000 et 1000 1000.

  3. Calculer la représentation binaire sur huit bits de l’entier relatif 16-16, puis de son opposé.

  4. Représenter les entiers relatifs 9696 et 4848 en binaire sur huit bits. Ajouter les deux nombres binaires obtenus en utilisant l’algorithme de l’addition binaire. Quel est l’entier relatif obtenu ? Pourquoi est-il négatif ?

  5. Calculer en binaire 15715 - 7.

Informatique et sciences du numérique Spécialité ISN en terminale S - Avec des exercices corrigés et des idées de projets par Gilles Dowek

4 Le bug de l’an 2038 de linux ***

Voici un extrait d’un article developpez.com sur le bug de l’an 2038.

Depuis la version 5.6 du noyau, publié en mars dernier, l’équipe a commencé à proposer des correctifs pour résoudre le problème de l’année 2038. Il s’agit d’un bogue détecté il y a longtemps dans l’encodage du temps sur les systèmes de type Unix, dont Linux, macOS, et d’autres systèmes d’exploitation compatibles POSIX. Sur ces systèmes, le calcul du temps est effectué en fonction des secondes écoulées à partir du 1er janvier 1970 à 00:00:00 UTC (nommée également epoch). Un jour donnera par exemple 86 400 secondes et une année 31 536 000 secondes.

Et plus les années passeront, plus il faudra de nombres pour représenter les dates. Pour effectuer le décompte sur ces systèmes, lorsque la fonction time() est appelée, elle retourne un entier signé de type “time_t”. Si le système est 32 bits, la valeur retournée est un entier signé 32 bits et si le système est 64 bits, la valeur retournée est 64 bits. Sur un système 64 bits, les limites sont supérieures à 292 milliards d’années. Il n’y a donc pas de soucis à se faire ici (ce sera beaucoup plus que l’âge de notre planète ou l’estimation de son espérance de vie).

Mais sur les systèmes 32 bits, le nombre de secondes total que la fonction peut retourner est 23112^{31}–1, c’est-à-dire environ 136 ans. La date de référence étant le 1er janvier 1970 à 00:00:00 UTC, la date minimale représentable est le vendredi 13 décembre 1901 et la date maximale représentable est le mardi 19 janvier 2038 à 3 h 14 min 8 s. Lorsqu’il sera 3 h 14 min 8 s le 19 janvier 2038, le système passera au 13 décembre 1901 à la seconde suivante (également appelé le bogue de l’an 2038 abrégé en anglais Y2038). Bien évidemment, ce ne sera pas la fin du monde. article developpez.com

  1. Quelle est la plus grande valeur pouvant être encodé sur 32 bits en complément à deux?

  2. Convertir la valeur précédente en ans jours heures minute seconde en considérant que les années font toutes 365 jours.

    >>sortie

    68 ans 35 jours 3 heures 14 minutes 7 secondes
  3. Vérifier la date indiquée par l’article sachant que les années bissextiles entre 1970 et 2038 sont:

    1972; 1976; 1980; 1984; 1988; 1992; 1996; 2000; 2004; 2008; 2012; 2016; 2020; 2024; 2028; 2032; 2036.

  4. Vérifier alors l’affirmation suivante concernant l’heure affichée une seconde plus tard si le bug n’était pas réparé.

    Le bug de l’an 2038, ou bogue de l’an 2038 (au Canada), aussi appelé Y2038, est un bug informatique similaire au bug de l’an 2000 qui pourrait perturber le fonctionnement d’un grand nombre de systèmes informatiques le 19 janvier 2038 à 3 h 14 min 8 s, temps universel. Ils afficheront alors 13 décembre 1901 et 20 h 45 min 52 s.

    Article Bug de l’an 2038 sur Wikipédia

  5. Repérer deux erreurs de l’article du site developpez.com.

5 Codage et décodage en Python

  1. Créer un programme qui demande un nombre à encoder et un nombre nn de bits d’encodage, et qui renvoie la représentation binaire du nombre en complément 2n2^n de ce nombre.

    P.ex:

    • si vous demandez le codage de -1 sur 4 bits, le programme affiche: "1111".
    • si vous demandez le codage de 5 sur 4 bits, le programme affiche: "0101".

    Pour simplifier, on supposera que l’utilisateur ne demande pas l’impossible, et que le nombre demandé peut être codé sur le nombre de bits donnés.

Aides:

  • Pour obtenir la représentation binaire d’un nombre entier naturel on utilise: bin(nombre)[2:].

    P.ex: bin(127)[2:] renvoie '1111111'

  • Pour parcourir un à un les éléments d’une chaîne de caractère, on utilise la syntaxe for élément in chaine_de_caractères:

    P.ex:

    for chiffre in '1111111':
        print(chiffre)
  • Pour forcer l’écriture sur nn bits d’un nombre binaire, on utilise: '{:0nd}'.format(nombre)

    P.ex: '{:08d}'.format(1000) renvoie '00001000'

Une des difficultés notables de cet exercice est qu’il faut traiter les nombres binaires comme des str. Réfléchissez bien aux types utilsés.

  1. Créer un programme qui demande un code binaire à décoder écrit sur nn bits, et qui renvoie la valeur décimale de ce nombre par décodage du nombre en complément 2n2^n.

    P.ex:

    • si vous demandez le décodage de "1111", le programme affiche: -1.
    • si vous demandez le décodage de "0101", le programme affiche: 5.

    le codage binaire donnant implicitement la valeur de n pour le complément à 2.

Aide

Pour obtenir la longueur d’une chaîne de caractères, on utilise la fonction len().

P.ex: len("0101") renvoie 4.