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 :

Différence signed/unsigned? [Débutant(e)]


Sujet :

C

  1. #1
    Membre régulier Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut Différence signed/unsigned?
    Voici un morceau de code trouvé au cours de mes lectures:
    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
    18
    #include <stdio.h>
     
    main()
    {
          signed char ch;
          int          x;
          unsigned int y;
     
          ch = 0xFF;
          x = 0xFFFF;
          y = 0xFFFF;
          printf("Valeur décimale de 0xFF signée :       %d\n",ch);
          printf("Valeur décimale de 0xFFFF signée :     %d\n", x);
          printf("Valeur décimale de 0xFFFF non signée : %u\n", y);
          printf("Valeur hexadécimale de 12345 :         0x%X\n", 12345);
          printf("Valeur hexadécimale de -12345 :        0x%X\n", -12345);
          return 0;
    }
    Après compilation j’obtiens la même valeur pour les variables: x(signed) et y(unsigned).
    Que n’ai-je pas compris? Merci.
    Lucky.
    Je ne dors pas longtemps, mais je dors vite.
    [Albert Einstein]

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ah mon avis cela viens du fait que sur ton os les int sont codé sur 4 octets et dans ton code tu rempli tes entiers avec 2 octets
    Essaye avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          x = 0xFFFFFFFF;
          y = 0xFFFFFFFF;
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre averti
    Avatar de ghostdogpr
    Étudiant
    Inscrit en
    Octobre 2003
    Messages
    198
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2003
    Messages : 198
    Points : 354
    Points
    354
    Par défaut
    Ou encore en restant sur 2 octets, utilise short et unsigned short au lieu de int et unsigned int.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ghostdogpr
    Ou encore en restant sur 2 octets, utilise short et unsigned short au lieu de int et unsigned int.
    Tout celà dépend entièrement de l'implémentation.Pour être portable, utiliser les valeurs prévues à cet effet :
    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
    18
     
    #include <stdio.h>
    #include <limits.h>
     
    int main(void)
    {
       signed char ch = 0xFF;
       int x = UINT_MAX;
       unsigned int y = UINT_MAX;
     
       printf("Valeur décimale de 0xFF signee :       %d\n", ch);
       printf("Valeur décimale de UINT_MAX signee :     %d\n", x);
       printf("Valeur décimale de UINT_MAX non signee : %u\n", y);
       printf("Valeur hexadécimale de 12345 :         0x%X\n", 12345);
       printf("Valeur hexadécimale de -12345 :        0x%X\n", -12345);
     
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre régulier Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut
    Merci pour ces réponses, je vais faire des essais et je vous informe des résultats.
    Lucky.
    Je ne dors pas longtemps, mais je dors vite.
    [Albert Einstein]

  6. #6
    Membre régulier Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut
    1
    Ah mon avis cela viens du fait que sur ton os les int sont codé sur 4 octets et dans ton code tu rempli tes entiers avec 2 octets
    Effectivement sous mon environnement les "int" sont codé sur 4 octets.
    Mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int y = 0xFFFFFFFF;
    est différent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int y = 0xFFFF;
    2
    Ou encore en restant sur 2 octets, utilise short et unsigned short au lieu de int et unsigned int.
    C'est une possibilité mais si l'on doit utiliser un intervalle de valeur plus grand, on est alors obligé d'utiliser des "int".

    3
    Tout celà dépend entièrement de l'implémentation.
    Tout a fait d'accord et il vaut mieux que le code soit le plus portable possible et non pour ma seule configuration.
    "limits.h" est-il un header standard?
    J’ai du oublier une option pour compiler l’exécutable au niveau de l’édition des liens, car le compilateur me dit que la fonction « UINT_MAX » n’a pas été déclaré.
    Lucky.
    Je ne dors pas longtemps, mais je dors vite.
    [Albert Einstein]

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lucky-94
    "limits.h" est-il un header standard?
    Non, mais <limits.h>, comme indiqué dans mon code (problèmes de lunettes ?) est standard
    J’ai du oublier une option pour compiler l’exécutable au niveau de l’édition des liens, car le compilateur me dit que la fonction « UINT_MAX » n’a pas été déclaré.
    Tu as du mettre des () où il ne faut pas. C'est UINT_MAX et non UINT_MAX(), et il faut inclure ce qu'il faut selon ce qui a été dit au-dessus...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre régulier Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut
    Quand j'ai noté "limits.h" je voulais dire ce fichier entre guillemets et non l'endroit où le cherchez.
    Pour le reste, «*UINT_MAX*» (je vais essayer de ne plus utiliser les guillemets) je l'avais simplement noté en minuscule pensant par erreur qu'il n'était pas sensible à la «*casse*».
    cela fonctionne maintenant.
    Merci.
    Lucky.
    Je ne dors pas longtemps, mais je dors vite.
    [Albert Einstein]

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lucky-94
    UINT_MAXje l'avais simplement noté en minuscule pensant par erreur qu'il n'était pas sensible à la « casse ».
    En C, tout est sensible à la casse. Même les noms des headers <>. Pour les "", ca dépend du système, mais c'est souvent vrai aussi.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/01/2010, 17h57
  2. Réponses: 14
    Dernier message: 12/04/2009, 20h47
  3. signed char et unsigned char
    Par sitamob dans le forum C
    Réponses: 7
    Dernier message: 07/04/2009, 20h54
  4. Réponses: 2
    Dernier message: 15/02/2009, 14h20
  5. probleme avec des signed ou unsigned double
    Par le_voisin dans le forum C++
    Réponses: 6
    Dernier message: 11/09/2006, 20h34

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