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 :

strtol et les nombres negatifs


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut strtol et les nombres negatifs
    Bonjour

    J'essaie avec strtol de convertion une chaine de caractère recupéré en hexa (fffffffd) valant -3 en decimal

    Hors lors que je l'utilise de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    long int  l_ivalue=0;
     
    memcpy(DataList[type].buffer,"fffffffd",8);
     
    l_livalue = strtol(DataList[type].buffer,NULL,16);
    buffer est defini comme suit : char buffer[255]

    l_livalue vaut 2147483647

    Quelqu'un peut m'expliquer pourquoi je ne retrouve pas mon -3

  2. #2
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Bonjour,

    le problème se trouve dans la mauvaise utilisation de memcpy. En effet, cette fonction copie n octets d'un bloc mémoire vers un autre, et ne se soucie pas de rajouter un '\0' à la fin de la chaîne de caractère. Autrement dit, après cette ligne, ton buffer vaut "fffffffd..." où les "..." peuvent valoir n'importe quoi, puisque le buffer n'a pas été initialisé.

    Pour résoudre le problème, il faut rajouter manuellement un '\0' à la fin du buffer en position 8.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Pour résoudre le problème, il faut rajouter manuellement un '\0' à la fin du buffer en position 8.
    Ou bien seulement changer la valeur du 3ème paramètre de la fonction memcpy : un 9 à la place du 8, car une chaîne littérale se termine toujours par un '\0'.

    Sinon, concernant le problème, il faut bien lire le man :
    La fonction strtol() renvoie le résultat de la conversion, à moins qu'un débordement superieur (overflow) ou inférieur (underflow) se produise. Si un dépassement inférieur se produit, strtol() renvoie LONG_MIN. Si un dépassement supérieur se produit, strtol() renvoie LONG_MAX.
    0xFFFFFFFD est égal à plus de 4 milliards. Or, un long int (le type de retour de la fonction) est normalement compris (après, ça dépend peut-être des machines ?) entre -2 147 483 648 à 2 147 483 647.
    En tout cas, chez moi, ça déborde allègrement et la fonction me renvoie aussi 2147483647 (ce qui correspond à ma constante LONG_MAX -> dépassement supérieur), avec errno mis à la valeur ERANGE.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Ou bien seulement changer la valeur du 3ème paramètre de la fonction memcpy : un 9 à la place du 8, car une chaîne littérale se termine toujours par un '\0'.

    Sinon, concernant le problème, il faut bien lire le man :


    0xFFFFFFFD est égal à plus de 4 milliards. Or, un long int (le type de retour de la fonction) est normalement compris (après, ça dépend peut-être des machines ?) entre -2 147 483 648 à 2 147 483 647.
    En tout cas, chez moi, ça déborde allègrement et la fonction me renvoie aussi 2147483647 (ce qui correspond à ma constante LONG_MAX -> dépassement supérieur), avec errno mis à la valeur ERANGE.

    Merci pour ces réponses ! je vais tester ça cette semaine et je validerais pour que ça serve à d'autres personnes on ne sait jamais

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

Discussions similaires

  1. [MS-DOS] Compter les nombres de jours entre deux dates diffé
    Par Furius dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 19/02/2006, 13h33
  2. problème avec les nombres à virgule
    Par shingo dans le forum Langage
    Réponses: 3
    Dernier message: 16/01/2006, 18h30
  3. Réponses: 24
    Dernier message: 27/09/2005, 21h16
  4. Les nombres complexe et delphi
    Par wikers dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2005, 11h47

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