IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Codage des entiers relatifs


Sujet :

Mathématiques

  1. #1
    Membre du Club Avatar de CompuTux
    Homme Profil pro
    Développeur Python et Django
    Inscrit en
    Août 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Python et Django
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut Codage des entiers relatifs
    Bonjour,

    J'ai un problème pour coder des entiers relatifs.

    Par exemple coder -8 sur 4 bits :

    8=1000

    Après où met-on le bit de signe ??? (puisque l'on est sur 4 bits)

    Autre exemple coder -125 sur un octet :

    125=01111101
    donc -125=11111101

    C'est juste ?

    Mais si on fait la somme : 01111101+11111101=101111010 là on est sur 9 bits; je ne comprends pas comment rester sur un octet...
    De plus on devrait trouver 00000000 puisque 125-125=0.

    Merci pour vos réponse !

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Ton problème est lié à quatre choses :
    • Le bit de signe est toujours en plus du nombre de bits significatifs. Donc, 8 demandant 4 bits pour être codé, tenir compte du signe exige d'avoir 5 bits...
    • Les opérations s'effectuent en augmentant le nombre de bits, donc en propageant le bit de signe, pour s'adapter au plus long des deux opérandes.
    • Un nombre négatif, en binaire, se calcule en faisant le complément à deux du nombre positif équivalent (négation binaire + 1).
      Donc, "-8" s'écrit NOT(01000)+1 = (10111)+1 = 11000 (5 bits), ou 11111000 (8 bits).
      Ton -125 sur 8 bits s'écrit NOT(01111101)+1 = (10000010)+1 = 10000011, et non pas 11111101.
    • En cas de dépassement (a.k.a carry ou retenue), les bits supplémentaires sont purement et simplement éliminés.


    Quelques liens de cours d'arithmétique binaire :
    Cours 1
    Cours 2
    Cours 3

    Bonne lecture !

  3. #3
    Membre du Club Avatar de CompuTux
    Homme Profil pro
    Développeur Python et Django
    Inscrit en
    Août 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Python et Django
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Ok si je comprends bien, -8 n'est pas codable sur 4 bits.

    De plus -125 codé en signe + valeur absolue, ajouté à 125 même codage donne un résultat faux.

    C'est ce que voulais montrer le prof je pense.

    D'où l'intérêt de coder les entiers relatifs en complément à 2 !

    Merci bien Mac Lak !

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par frenchem67 Voir le message
    Ok si je comprends bien, -8 n'est pas codable sur 4 bits.
    Tu as bien compris.

    Citation Envoyé par frenchem67 Voir le message
    De plus -125 codé en signe + valeur absolue, ajouté à 125 même codage donne un résultat faux.
    En effet : la somme est alors égale à (125*2)+bit de signe, donc une sorte de "-250", ce qui n'est pas le résultat recherché.

    Citation Envoyé par frenchem67 Voir le message
    D'où l'intérêt de coder les entiers relatifs en complément à 2 !
    En réalité, additionner deux nombres opposés en binaire ne produit pas réellement zéro : si tu codes sur N bits, le résultat de (k+(-k)) est égal à 2^N, chiffre qui nécessite (N+1) bits pour être écrit en binaire, et qui vaut "un" suivi de N fois "zéro".
    Or, en repassant sur N bits, on a donc bien zéro partout, plus un bit de dépassement (retenue/carry) qui permet de propager la retenue, notamment lorsque l'on manipule des nombres binaires plus grands que le mot-machine (ex : opérations sur des données 64 bits sur un processeur 32 bits, qui nécessite deux opérations 32 bits + propagation de la retenue).

    C'est donc pour ça que l'opposé d'un nombre en binaire est le complément à deux : tu peux facilement le vérifier par toi-même, c'est un bon exercice d'ailleurs. Et cela t'explique aussi pourquoi il est impératif de connaître le nombre total de bits utilisés pour l'encodage si l'on veut écrire un nombre binaire "négatif"... (-1) codé sur 8, 16 ou 32 bits, ce sont trois nombres différents !!

    Tant que tu retiens bien que les opérations binaires se font sur un nombre figé de bits, avec éventuellement propagation d'une retenue, le binaire est plutôt simple. Si par contre tu prends le réflexe (hélas courant) d'omettre les zéros non-significatifs, qui permettent d'avoir la taille en bits des nombres, alors tu vas aller assez vite dans le mur... En général, dès le premier NOT binaire, d'ailleurs.

    Quand on te demande d'écrire / utiliser un nombre en binaire, ta première question doit toujours être "Sur combien de bits ?". Graves-toi ça dans la tête, et le binaire ne te posera (presque) jamais de problèmes.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    468
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 468
    Points : 693
    Points
    693
    Par défaut
    Citation Envoyé par frenchem67 Voir le message
    Ok si je comprends bien, -8 n'est pas codable sur 4 bits.
    Citation Envoyé par Mac LAK Voir le message
    Tu as bien compris.
    Pardon ! Pour moi si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    1000 : -8
    1001 : -7
    1010 : -6
    1011 : -5
    1100 : -4
    1101 : -3
    1110 : -2
    1111 : -1
    0000 : +0
    0001 : +1
    0010 : +2
    0011 : +3
    0100 : +4
    0101 : +5
    0110 : +6
    0111 : +7
    Tout comme un entier signé sur 8 bits a sa portée de -128 à 127
    un entier signé sur 4 bits a sa portée de -8 à 7

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    C'est vrai dans un contexte d'implémentation, notamment pour ne pas perdre une des valeurs utile.

    Mais côté arithmétique, ton 1000 est ambigü : il peut valoir -8, 8, ou... "moins zéro" !!! Et les trois interprétations seraient plus ou moins cohérentes, en plus...

    Par convention, et en arithmétique binaire (donc, des maths "pures"), il vaut mieux éviter d'utiliser la valeur limite négative. En implémentation (en informatique, donc), on expose ce cas particulier.
    Mais dire que c'est -8 ou 8, c'est une simple convention.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    468
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 468
    Points : 693
    Points
    693
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    C'est vrai dans un contexte d'implémentation, notamment pour ne pas perdre une des valeurs utile.

    Mais côté arithmétique, ton 1000 est ambigü : il peut valoir -8, 8, ou... "moins zéro" !!! Et les trois interprétations seraient plus ou moins cohérentes, en plus...

    Par convention, et en arithmétique binaire (donc, des maths "pures"), il vaut mieux éviter d'utiliser la valeur limite négative. En implémentation (en informatique, donc), on expose ce cas particulier.
    Mais dire que c'est -8 ou 8, c'est une simple convention.
    Pas super ton rattrapage aux branches !

    En tout cas il ne peut en aucun valoir "moins zéro" !!!

    TOUTES les conventions classiques utilisent le dernier bit pour le signe. C'est à dire que lorsqu'il est à 1 le nombre est négatif. Point barre... ce nombre n'est pas plus particulier que les autres.

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ijk-ref Voir le message
    En tout cas il ne peut en aucun valoir "moins zéro" !!!
    Et pourtant... En représentation naïve (bit de signe + valeur absolue), qui est un autre codage des entiers relatifs tout à fait légitime même s'il ne permet pas les opérations classiques, tu as bien une ambigüité.
    Tout est question de conventions.

    Citation Envoyé par ijk-ref Voir le message
    TOUTES les conventions classiques utilisent le dernier bit pour le signe. C'est à dire que lorsqu'il est à 1 le nombre est négatif.
    Ce sont des conventions d'implémentation, c'est à dire ce qui existe réellement sur des CPU.
    Côté arithmétique binaire pure et dure, donc des maths, ce cas est litigieux. Il est par contre plus simple de prendre en compte d'abord et avant tout le bit de signe dans une implémentation, notamment pour mettre à jour les bons flags du CPU après une opération.

    Que tu prennes comme valeur limite 8 ou -8 pour 1000, ça ne change pas le fait que 7+1 = 0111 + 0001 = 1000 : il vaut quoi, alors, 8 ou -8 ??? Parce que dans le même temps : (-7) + (-1) = 1001 + 1111 = 1000 : si ça, c'est pas ambigu...

    En fait, ça ne l'est pas, mais pour le voir, il faudrait conserver le 5ème bit. Or, comme ce codage des relatifs impose un nombre de bits fixé, tu perds l'information te permettant de discriminer le cas. D'un point de vue mathématique, tu as une congruence sur 16 (2^4) : normalement, elle va de 0 à 15. Après, tu peux "recadrer" ce domaine comme ça te chante via n'importe quelle bijection, mais aucune n'est "mieux" ou "plus valide" qu'une autre.

    Tu confonds les maths et l'application des maths, ou si tu préfères l'algo et le code implémentant l'algo en question.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    468
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 468
    Points : 693
    Points
    693
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Et pourtant... En représentation naïve (bit de signe + valeur absolue), qui est un autre codage des entiers relatifs tout à fait légitime même s'il ne permet pas les opérations classiques, tu as bien une ambigüité.
    Tout est question de conventions
    ... sauf que depuis le début on représente tous les autres nombres en complément à deux... donc je ne vois pas "au nom de quoi" tu voudrais un traitement particulier au nombre "1000" !?

    C'est à dire que s'il peut parfaitement représenter -8 ou 8 (plus exactement 8 modulo 16) il ne peut en aucun cas représenter "-0" avec cette convention.
    Citation Envoyé par Mac LAK Voir le message
    Tu confonds les maths et l'application des maths, ou si tu préfères l'algo et le code implémentant l'algo en question.
    Je ne confonds rien du tout. Ce n'est pas moi qui est confirmé que l'on ne pouvait pas représenter le nombre -8 avec 4 bits

    ... alors que c'était surement le piège dans son exercice !

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ijk-ref Voir le message
    ... sauf que depuis le début
    J'ai bien mis "en représentation naïve", relis...

    Citation Envoyé par ijk-ref Voir le message
    Je ne confonds rien du tout.
    Avec 4 bits, tu peux représenter très exactement 16 valeurs distinctes, ni plus, ni moins. Le fait d'avoir -8 ou 8 pour la valeur limite n'est qu'une question de convention.
    Mathématiquement parlant, les deux sont parfaitement légitimes et valides, et produisent tous les deux une valeur correcte (cf. post précédent) : il n'y a donc pas de raison particulière, sauf habitude d'implémentation, de privilégier l'une plutôt que l'autre, ou même de décider que ce n'est pas une valeur légale, d'ailleurs !

    Par rapport à la question initiale, qui sous-entend de pouvoir coder à la fois 8 et -8, tu dois passer sur 5 bits pour permettre ça (et conserver un intervalle sy. Sinon, tu perds la possibilité de coder soit l'un, soit l'autre en fonction de la convention choisie.

    Ce que je précise en disant que le bit de signe est "en plus" des bits significatifs (16 bits signés = 15 bits utiles = valeurs absolues de 0 à ... 32767 !). Le fait qu'il "reste" une valeur possible dans l'intervalle (nombre constitué du bit de signe à 1 suivi de zéros) et qu'on ne la rendre pas invalide est un effet de bord.

    Pour l'anecdote, j'utilise très couramment (en interface avec l'électronique notamment) une convention qui veut que, sur un nombre 16 bits, le zéro soit "1000000000000000"... C'est à dire la valeur médiane de l'intervalle (le "-32767" valant 1, le "+32767" valant 1 répété 16 fois, un zéro binaire est une erreur de conversion / overflow). Même si les opérations binaires classiques ne peuvent pas être appliquées telles quelles, cela reste une représentation acceptable des entiers binaires relatifs... Et c'est directement issu d'un CPU, pourtant !!

Discussions similaires

  1. Codage des entiers dans socket (réception par java)
    Par theanthony33 dans le forum C#
    Réponses: 3
    Dernier message: 26/06/2010, 22h16
  2. Ecrire ensemble des entiers relatifs en Latex
    Par codepvc dans le forum Débuter
    Réponses: 2
    Dernier message: 22/05/2009, 10h23
  3. [XML en Russe et Français] - Codage des carctères
    Par mpereg dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 28/11/2007, 23h45
  4. [DB2] LIKE sur des entiers
    Par heloise dans le forum DB2
    Réponses: 1
    Dernier message: 08/10/2004, 00h30
  5. Réponses: 9
    Dernier message: 17/01/2003, 12h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo