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

C Discussion :

overflow sur int


Sujet :

C

  1. #41
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 737
    Par défaut
    Salut henderson,

    Citation Envoyé par henderson Voir le message
    Tu as montré une soustraction 1 - (-1) qui donne 2...
    Est-ce qu'il y a quelque chose qui échappe dans le terme non signé ? Que le résultat soit 2 est alors faux sauf si on prend en compte l'overflow des entier non signés, CF, qui indique qu'il faut retirer 232 pour avoir le bon résultat.
    0xFFFFFFFF ne vaut -1 que pour les entiers signés mais 0xFFFFFFFF vaut 4294967295 pour un entier non signé. Et 1 - 4294967295 ne vaut pas 2 et ne peut être un entier non signé d'où l'overflow CF.

    Si j'avais tort, le CF ne passerait pas à 1.

    Salut

  2. #42
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 469
    Par défaut
    Le problème est qu'une soustraction s'effectue par addition d'un complément à deux !
    Je ne pense pas que les CPU sachent faire une soustraction quand bien même on ait SUB SBC...!
    Et comme je l'ai dit, le complément à deux de 0xFFFFFFFF c'est 0x00000001 ! Donc 1 + 1 = 2 !
    Ca se passe au niveau binaire et non pas selon l'idée que tu peux te faire du contenu !
    Pour rappel, le complément à deux s'obtient en inversant les bits puis on ajoute 1.

  3. #43
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 737
    Par défaut
    Citation Envoyé par henderson Voir le message
    ...le complément à deux de 0xFFFFFFFF c'est 0x00000001 ! Donc 1 + 1 = 2 !
    Si n non signé = 0xFFFFFFFF = 232 - 1, alors 1 - n = 1 - (232 - 1) = 2 - 232 = 2 avec une retenue négative de 232 indiquée par l'overflow CF=1. S'arrêter au résultat sans prise en compte des flags est une erreur.

    Le complément à 2 transforme une valeur n, par exemple en 32 bits, en 232 - n (d'où le terme complément à 2). Cette valeur est interprétée en -n seulement si on considère que c'est un entier signé (on fait alors l'impasse sur le terme hors champ 232). En résumé le complément à 2 n'est le négatif d'un nombre que si on considère avoir des entiers signés. Mais c'est la même opération SUB qui s'applique sur des entiers signés et non signés, la distinction des éventuelles retenues se faisant en utilisant systématiquement CF pour les non signés et OF pour les signés.

    L'opération semble comprise mais pas la différence d'interprétation selon que c'est des signés ou des non signés.

    Prenons la valeur n = 0x80000000 = 231. Son complément à 2 est la même valeur ce qui est normal car n est la moitié de 232 : 232 - 231 = 231. Cela marche donc très bien en non signé. En signé, cela signifie que n = -n donc que n = 0. On se retrouve donc avec deux valeurs 0 non égales. Pire, un résultat à 0x80000000 n'entraîne pas un ZF à 1. On évite donc cette valeur en signé. Ceci indique que, même si les opérations sont communes, elles se différencient par les gammes et l'usage des flags.

    Rappeler des erreurs avec force points d'exclamations ne les corrige pas : le complément à 2 d'un non signé n'est pas un nombre négatif (qui ne saurait exister pour eux), c'est simplement le complément à 2 soit 232 - n .

    Salut

  4. #44
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 469
    Par défaut
    Pour effectuer une soustraction A - B le cpu effectue :

    A + (B barré ) + 1

    En termes d'incohérences et d'overflow divers, il y a y aussi ce que l'on peut rencontrer en BCD.
    Mais dans ce cas précis, il est facile de le détecter puisque la valeur de chaque digit doit être dans l'intervalle [0,9]!

Discussions similaires

  1. Probleme d'overflow sur le port série
    Par jimay dans le forum MATLAB
    Réponses: 2
    Dernier message: 29/03/2007, 12h23
  2. Problème vidéo et overflow sur Mac
    Par gregmab dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 22/02/2007, 19h28
  3. Test sur int négatif: c'est comment?
    Par Jean_Benoit dans le forum C++
    Réponses: 3
    Dernier message: 08/10/2006, 14h35
  4. [XHTML][CSS] Overflow sur DIV sans taille déterminée
    Par pingos dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 20/08/2006, 16h37
  5. erreur ASM inline sur 'INT' avec delphi7
    Par the_magik_mushroom dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2005, 02h41

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