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

Assembleur Discussion :

Les nombres négatifs et décimaux en binaire


Sujet :

Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : Août 2008
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Les nombres négatifs et décimaux en binaire
    Bonsoir à tous,

    Voilà, je suis nouveau en informatique et je désire savoir comment on peut coder les nombres décimaux et négatifs en binaire. J'ai lu dans un des tutos de developpez.com que pour changer un nombre en négatif il fallait juste inverser tous les bits et ajouter 1 au résultat; autrement dit
    • Les nombres positifs sont codés de la même façon qu’en convention « signe et valeur absolue ».
    • Les nombres négatifs sont obtenus en inversant tous les bits, puis en ajoutant 1.
    Mais le problème ici est que quand on désire récupérer la valeur de ce nombre négatif on obtient une d'un autre nombre positif.
    Dans son exemple il a travaillé avec le nombre 14
    Exemple : le nombre 14 codé sur 8 bits est représenté ainsi :
    00001110
    et (–14) ainsi :
    -inversion des bits : 11110001
    -ajout d’une unité : 11110010
    -résultat : 11110010

    Remarque : le résultat intermédiaire, 11110001, est appelé « complément à 1 ».

    Vous allez immédiatement comprendre l’avantage de cette représentation. Faisons la somme
    de 14 et de (–14), de la même façon que s’il s’agissait d’entiers positifs :
    00001110 + 11110010 = 100000000
    Le résultat étant codé sur 8 bits, le 1 situé à gauche n’est pas pris en compte. On obtient donc
    14 + (-14) = 0.
    Dans cet exemple si le code binaire 11110010(-14) vaut 242 en décimal.

    Merci de m'expliquer un peu plus comment faire pour les négatifs et les décimaux ou de me donner un lien concernant ce que je cherche

    Merci d'avance pour toute réponse

    Désolé si ce n'est pas la partie concernée du forum j'ai cherché mais je n'ai rien trouvé en ce qui concerne le binaire

  2. #2
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Citation Envoyé par Amiraamir Voir le message
    mais le problème ici c'est que quand on désire récupérer la valeur décimale de ce nombre négatif on obtient une d'un autre nombre positif.
    La représentation décimale tu veux dire. Si tu veux afficher un entier signé il suffit d'afficher un moins si le nombre est négatif (si le bit signe est égal à 1), puis tu affiches la valeur absolue.
    :wq

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Il s'agit surtout de savoir si tu considères que ton nombre binaire est signé ou non signé. D'où les fameux types en C. Le problème, en réalité est fort simple : il suffit de prendre en exemple un compteur kilométrique.

    Si tu achètes une voiture neuve et que son compteur affiche « 00000 », si tu fais un kilomètre en marche arrière, le compteur affichera « 99999 » (en considérant bien sûr que le dispositif n'est pas protégé contre ce genre de bidouille).

    Ton « 99999 » peut donc être interprété comme un « -1 ». Donc soit, tu considères que tes kilomètres sont toujours positifs et tu peux compter de 0 à 99999, soit tu considères que tu peux avoir des nombres positifs et négatifs et dans ce cas, tu coupes le tableau en deux : les valeurs de 00000 à 49999 sont positives, et celle de 50000 à 99999 sont en fait les valeurs négatives obtenues en « partant de l'autre sens ».

    Donc si le chiffre le plus à gauche de ton compteur est compris entre 0 et 4, ton nombre est positif, s'il est compris entre 5 et 9, c'est en fait un nombre négatif. Ça tombe bien : en binaire, un chiffre ne peut prendre que deux valeurs. Donc si ton bit de poids fort est nul -> positif, à un -> négatif. Le bit de poids fort d'un nombre est donc considéré comme le signe d'un binaire signé.

    Pour les parties rationnelles, c'est comme en décimal, où chaque chiffre vaut dix fois moins que son voisin de gauche. Le premier chiffre après la virgule vaut donc n/10, le second n/100, le troisième n/1000, etc. Rien ne t'empêche de faire la même chose en binaire en posant la virgule ou tu veux. Format à « virgule fixe », donc. Les bits à droite de cette virgule vaudront alors respectivement 1/2, 1/4, 1/8, 1/16 ...

    Ça, c'est pour le binaire naturel.

    En revanche, pour coder des nombres à virgules en informatique, on utilise le format dit « à virgule flottante » (le fameux float). Là, par contre, c'est complètement artificiel : on prend un champ de taille fixe (généralement 32 ou 64 bits), et on réserve un bit pour le signe (indépendament du nombre), quelques bits (huit pour un float32) pour l'exposant (2 puissance n) qui, en gros, va dire où se trouve la virgule par rapport à ton champ, et le reste pour la valeur elle-même. Il s'agit toujours de la valeur absolue du nombre, indépendament du bit de signe. Pas de complémentation ici.

    Ce format s'est répandu très vite partout, mais pendant très longtemps, il n'y a pu être traité que logiciellement. Il a fallu attendre les coprocesseurs mathématiques sur PC pour qu'ils soient enfin traités par un circuit dédié.

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : Août 2008
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Premièrement merci a vous pour vos réponses et surtout a toi Obsidian.
    Puis je voudrait savoir comment l'ordinateur ou plus présisément le processeur peu faire la différence entre -14 et 242 pour le code 11110010 ?
    Autre question : existe il des cours dédier (principalement) a apprendre le principe des différents type de nombres en binaire si oui merci de me l'indiquer.

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Amiraamir Voir le message
    Premièrement merci a vous pour vos réponses et surtout a toi Obsidian.
    Puis je voudrait savoir comment l'ordinateur ou plus présisément le processeur peu faire la différence entre -14 et 242 pour le code 11110010 ?
    Le choix des instructions lui indique l'interpretation a donner aux suites de bits.
    En gros, il y a trois types de langages:
    - les langages statiquement types, ou on donne un type aux variables et c'est ce type qui indique comment il faut interprete une sequence de bits (p.e. en C si tu declares ta variable signed char, si son contenu exprimee en binaire est 11110010, il faut l'interprete comme -14; si tu declares la variable unsigned char, pour le meme contenu il faut l'interprete comme 242).
    - les langages types dynamiquement; ce sont les valeurs qui portent une indication de leur type; tu n'auras pas de variable dont le contenu est simplement 11110010, le contenu d'une variable a deux parties: une marque de type et la representation.
    - les langages non types, ou ce sont les instructions qui indiquent la maniere dont il faut interpreter les suites de bits; les assembleurs sont dans ce cas comme des langages plus vieux (les plus connus sont BCPL et BLISS, mais ceux qui les connaissent reellement commencent a avoir des cheveux blancs)
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par Amiraamir Voir le message
    Premièrement merci a vous pour vos réponses et surtout a toi Obsidian. Puis je voudrait savoir comment l'ordinateur ou plus présisément le processeur peu faire la différence entre -14 et 242 pour le code 11110010 ?
    Il ne le fait pas, et il n'a pas besoin. La configuration des bits étant les mêmes, il retombera sur ses pattes de toutes façon.

    Pour être plus précis, les mécanismes qui font les calculs sont les mêmes. C'est généralement à l'interprétation du résultat que la différence va se faire. Par exemple, ja (Jump if Above) examine le résultat en partant du principe que les nombres étaient non-signés, tandis que jg (Jump if Greater) va faire la même chose mais en les considérant comme signés.

    À chaque opération logique ou arithmétique, des flags sont positionnés indépendament les uns des autres. Par exemple « Z », qui est un indicateur de zéro. Ce flag vaut un si le résultat de la dernière opération était nul. En examinant ces flags, ainsi que la retenu. On peut en déduire toutes sortes de choses. Il suffit donc de conditionner des sauts sur l'état de ces bits.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ce format s'est répandu très vite partout, mais pendant très longtemps, il n'y a pu être traité que logiciellement. Il a fallu attendre les coprocesseurs mathématiques sur PC pour qu'ils soient enfin traités par un circuit dédié.
    Il y a un monde en dehors des PC. Il y a des ordinateurs interpretant en hard les flottants depuis les annees 40.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Il y a un monde en dehors des PC. Il y a des ordinateurs interpretant en hard les flottants depuis les annees 40.
    Je n'ai pas dit le contraire.

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Obsidian
    Ce format s'est répandu très vite partout, mais pendant très longtemps, il n'y a pu être traité que logiciellement. Il a fallu attendre les coprocesseurs mathématiques sur PC pour qu'ils soient enfin traités par un circuit dédié.
    Citation Envoyé par Obsidian Voir le message
    Je n'ai pas dit le contraire.
    J'ai du mal a interpreter la phrase que je recite autrement que comme "avant les coprocesseurs mathematiques sur PC, les formats flottants n'etaient traites que logiciellement."
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    J'ai du mal a interpreter la phrase que je recite autrement que comme "avant les coprocesseurs mathematiques sur PC, les formats flottants n'etaient traites que logiciellement."
    J'aurais même dû débuter ma phrase par « Sur PC, en particulier, ... », en effet.
    Mais je crois qu'on est d'accord.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. TextField qui ne prend que les nombres négatifs
    Par aljessy dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 16/09/2012, 00h16
  2. Exception pour gérer les nombres négatifs
    Par bilou_12 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 01/02/2012, 18h35
  3. Interdire les nombre négatif
    Par pymouse dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/10/2009, 17h02
  4. QLCDNumber et les nombres négatifs
    Par black is beautiful dans le forum Débuter
    Réponses: 5
    Dernier message: 28/02/2009, 15h28
  5. les nombres négatifs et MySQL
    Par oussamamohamed dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/02/2008, 12h44

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