Aller au contenu

03 Exos Représentation entiers relatifs Correction

Entiers positifs ou négatifs⚓︎

Exercice 1⚓︎

Pour les entiers naturels :

  1. Quel est le nombre binaire après \(10011011\) ?
    \(10011011 + 1 = 10011100\)

  2. Combien de mots binaires (nombres en binaire) différents peut-on former avec \(8\) bits ?
    \(2^{8} = 256\) nombres différents.

  3. Quel intervalle de nombres entiers naturels peut-on représenter sur \(8\) bits ?
    \(2^{8}\) nombres de \(0\) à \(2^{8} - 1 = 255\).

  4. Combien de bits au minimum faut-il pour coder en binaire le nombre \(120\) ?
    \(7\) bits suffisent, car \(2^{6} <= 120 < 2^{7}\).

Exercice 2⚓︎

Pour les entiers relatifs, codés en complément à 2 sur 8 bits :

  1. De quel signe est le nombre codé \(10011011\) ?
    négatif car il commence par un \(1\).

  2. Quel est le nombre binaire après \(10011011\) ?
    \(10011011 + 1 = 10011100\)

  3. De quel signe est le nombre codé \(1011011\) ?
    Attention, on n'a écrit que \(7\) chiffres. Sur \(8\) bits, il s'écrit en fait \(01011011\).
    Il est donc positif car il commence par un \(0\).

  4. Combien de nombres relatifs différents peut-on former avec \(8\) bits ?
    \(2^{8} = 256\) nombres différents.

  5. Quel intervalle de nombres entiers relatifs peut-on représenter sur \(8\) bits ?
    \(2^{8}\) nombres de \(-2^{7} = -128\) à \(2^{7} - 1 = 127\).

  6. Combien de bits au minimum faut-il pour coder en complément à 2 le nombre \(120\) ?
    Il faut \(8\) bits, car \(2^{6} <= 120 < 2^{7}\), et qu'on a toujours \(1\) bits en plus pour les relatifs...

  7. Combien de bits au minimum faut-il pour coder en complément à 2 le nombre \(-120\) ?
    C'est pareil : il faut \(8\) bits, car \(2^{6} <= 120 < 2^{7}\), et qu'on a toujours \(1\) bits en plus pour les relatifs...

  8. En codage en complément à deux sur \(1\) octet, le codage de \(-20\) est le même que le codage binaire de quel nombre positif ?
    \(-20 + 256 = 236\)

Exercice 3⚓︎

Écrire les opposés en base 2 d’entiers signés écrits en base 2.

  1. Comment écrit-on en base 2 signée sur 1 octet l’opposé de 01000110.
    L'opposé de \(01000110\) est \(10111001 + 1 = 10111010\)

  2. Comment écrit-on en base 2 signée sur 1 octet l’opposé de 10110111.
    \(10110111\) est négatif.
    L'opposé de \(10110111\) est le complément à \(1\) de \(10110110\), c'est-à-dire \(01001001\).

  3. Comment écrit-on en base 2 signée sur 1 octet l’opposé de 10110110.
    \(10110110\) est négatif, c'est \(1\) de moins que le précédent.
    L'opposé de \(10110110\) est \(01001010\).

Exercice 4⚓︎

Convertir en base 10 un entier signé écrit en base 2

  1. Donner en base 10 la valeur de 11001100 considéré comme un octet signé.
    \(11001100_2 = 204_{10}\), donc \(11001100\) représente \(204 - 256 = -52\).

  2. Donner en base 10 la valeur de 11100000 considéré comme un octet signé.
    \(11100000_2 = 224_{10}\), donc \(11100000\) représente \(224 - 256 = -32\).

Exercice 5⚓︎

Convertir en base 2 un entier signé écrit en base 10

Représenter en complément à 2 sur 8 bits les entiers -100 ; 83 et -29.
\(-100\) doit être représenté comme l'entier naturel \(-100 + 256 = 156\), donc par \(10011100\).
autre manière :
\(100\) est représenté sur 8 bits par \(01100100\), et le complément à \(2\) est \(10011100\).

\(83\) est positif, donc est représenté par \(1010011\).

\(-29\) doit être représenté comme l'entier naturel \(-29 + 256 = 227\), donc par \(11100011\).
autre manière :
\(29\) est représenté sur 8 bits par \(00011101\), et le complément à \(2\) est \(11100011\).

Exercice 6 : Programmation⚓︎

Ecrire en Python une fonction permettant de coder un entier relatif sur \(n\) bits en complément à \(2\).
On reprend la fonction de conversion de la fiche précédente :

🐍 Script Python
def conversion_from_decimal(base, nombre):
    """base est un entier représentant la base d'arrivée
    nombre est un entier à convertir
    la fonction retourne un string qui représente le nombre converti"""
    Lchiffres = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
    valeurBase = ''
    while nombre != 0:
        reste = nombre % base
        valeurBase = Lchiffres[reste] + valeurBase
        nombre = nombre // base
    return valeurBase

et on l'applique à \(x\) quand \(x\) est positif, et à \(2^n + x\) quand \(x\) est négatif.

🐍 Script Python
def conversion_to_signed_binary(nombre, n):
    """nombre est un entier à convertir
    en binaire signé codé sur n bits
    la fonction retourne un string qui représente le nombre converti"""
    if nombre >= 0:
        return conversion_from_decimal(2, nombre)
    conversion_from_decimal(2, 2**n + nombre)