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 :

Gestion des overflow sur des opérations d'addition


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 55
    Points : 24
    Points
    24
    Par défaut Gestion des overflow sur des opérations d'addition
    Bonjour,

    je souhaite faire une opération d'addition entre des entiers signés de 64-bits. Vu que le processeur cible est un 32-bits, j'ai dû créer une structure dans mon programme C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct{
       long LSW;
       long MSW; 
    } INT64;
    le type "long" étant un entier 32-bits.


    Mon problème se situe au niveau de la gestion des overflow. les spécifications sont telles qu'on ne pourrait atteindre la valeur maximale possible avec un 64-bits. Donc, les overflows n'apparaissent qu'au niveau des opérations entre LSW.

    Exemple:
    opération E1 + E2
    E1: LSW = 2^31
    MSW = 15
    E2: LSW = 2^5
    MSW = 1
    En ce qui concerne la détection des overflows, il faut vérifier dans le cas où les deux opérandes sont du même signe que le résultat de l'addition l'est également; sinon, il y a overflow.

    Ma préoccupation est de pouvoir reporter la retenue de l'opération entre les LSW sur celle entre les MSW.

    Merci de m'aider à trouver une solution.


    ps: j'espère que j'ai été claire.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Boe,

    Quel compilateur utilises-tu ?

    Il a certainement un type de 64 bits, la dénomination dépendant du compilateur.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    J'utilise GCC et je développe sous eclipse.

  4. #4
    Membre à l'essai
    Profil pro
    Lycéen
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Maroc

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Points : 17
    Points
    17
    Par défaut
    Le type long long occupe 64 bits.

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Merci Youcef pour ta réponse.

    Pourrais tu m'en dire plus sur le type "long long"?


    Merci.

  6. #6
    Membre à l'essai
    Profil pro
    Lycéen
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : Maroc

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Points : 17
    Points
    17
    Par défaut
    D'après ce que j'ai dans limits.h :
    La valeur maximale de signed long long est 9223372036854775807, sa valeur minimale est -9223372036854775806.
    La valeur maximale de unsigned long long est 18446744073709551615.
    J'ai lu sur un site que le compilateur utilise deux registre 32 bits pour stocker un long long (par exemple edx:eax).
    Pour afficher la valeur d'un long long avec printf, utilise le format : %I64d (ou %I64u pour un unsigned) sous windows, et %lld (ou %llu) sous les autres systèmes.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Bonjour Youcef,

    j'ai eu du mal à me connecter depuis ma dernière réponse sur le forum.

    J'ai essayé d'utiliser le type "long long" mais j'ai un warning (integer constant is too large for "long" type). ce n'est pas bien grave mais je préfère les éviter.

    En restant sur ma méthode qui est de décomposer le nombre de 64 bits en deux nombres de 32 bits, j'utilise la fonction modulo sur la partie basse (les LSB) et le résultat de l'opération est rajoutée à la partie haute (les MSB).

    Pour l'instant, je n'ai pas d'erreur mais je laisse la discussion ouverte.


    Merci
    Nates

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 568
    Points
    41 568
    Par défaut
    Citation Envoyé par youscef Voir le message
    %I64d (ou %I64u pour un unsigned) sous windows.
    Pour être précis, c'est "sous les vieilles versions de Visual et sous MinGW": Les versions récentes supportent parfaitement le format standard pour les long long.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Nai,
    Citation Envoyé par Nates Voir le message
    J'ai essayé d'utiliser le type "long long" mais j'ai un warning (integer constant is too large for "long" type). ce n'est pas bien grave mais je préfère les éviter.
    Parce que tu essayes de la mettre dans un type long. Évidemment, il ne faut pas mélanger.

    Citation Envoyé par Nates Voir le message
    En restant sur ma méthode qui est de décomposer le nombre de 64 bits en deux nombres de 32 bits, j'utilise la fonction modulo sur la partie basse (les LSB) et le résultat de l'opération est rajoutée à la partie haute (les MSB)
    c'est précisément ce que fait le type long long de gcc, alors pourquoi vouloir réinventer la roue (SAUF si c'est pour apprendre, mais ça n'a pas l'air d'être ton cas) ?
    Si les cons volaient, il ferait nuit à midi.

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Merci pour vos réponses. Vos conseils m'ont bien été utiles

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

Discussions similaires

  1. Gestion de projet: encodage des heures sur des tâches
    Par Terminator dans le forum Gestion de projet
    Réponses: 2
    Dernier message: 03/02/2015, 11h10
  2. Comment ajouter des séries dans des graphes sur des feuilles variables
    Par Molomarcopolo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2012, 16h26
  3. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 09h44
  4. Gestion de droits sur des méthodes de classe
    Par Braillane dans le forum Diagrammes de Classes
    Réponses: 1
    Dernier message: 06/10/2008, 16h31
  5. [MCD]Gestion des droits sur des forums
    Par Vivian Pennel dans le forum Schéma
    Réponses: 1
    Dernier message: 01/05/2007, 16h43

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