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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ex-technicien-coloriste
    Inscrit en
    décembre 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ex-technicien-coloriste

    Informations forums :
    Inscription : décembre 2013
    Messages : 24
    Points : 14
    Points
    14

    Par défaut [unsigned] Quelquechose qui m'intrigue avec "if" et "unsigned"

    Bonjour,

    J'ai croisé un code à tester assez bizarre dont voici l'exemple:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include <stdlib.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdbool.h>
    #include <string.h>
    #include <errno.h>
     
    int main()
     
     int16_t X= 0;
     bool Y= 1;
     
     X = -99;
     
        /*commandeGisement verification */
     
    // if ((X > 100)) // Cas A
    if ((X > 100u)) //Cas B
        {
        Y = 0;
        }
     
       printf(" l=%i\n cg = %i\n",Y, X);
     
     return 0;
    }
    Dans le Cas A (100, actuellement en commentaire), si X est une valeur entre -100 et -1, Y retournera 1

    Dans le Cas B (100u, non commenté), si X est une valeur entre -100 et -1, Y retournera 0


    Pourtant, 100u et 100 ont la même valeur, donc X restera toujours inférieur à cette valeur.

    Est-ce que le compilateur, quand il rencontre le cas de figure B, met X en uint16 et non pas en int16? dans ce cas, pour le cas -99, pourquoi cela ne reste t-il pas à 1?

    Quelque sait-il comment cela se déroule?

  2. #2
    Expert confirmé
    Inscrit en
    mars 2005
    Messages
    1 426
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 426
    Points : 4 166
    Points
    4 166

    Par défaut

    La valeur entière de X est en effet convertie en entier non signé avant la comparaison. IIRC la norme précise que - et ce quelque soit l'encodage sous-jacent - la conversion d'un entier négatif z doit renvoyer l'entier positif n le plus petit tel qu'il soit congru au nombre négatif modulo 2 élevé à la puissance du nombre de bits b utilisé pour représenter n. Autrement formulé, on obtient n = 2^b - |z|, ou n = 2^b + z .

    Dans ton cas avec 100u de type unsigned int, on devrait avoir (UINT_MAX devant se traduire 2^32 - 1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int16_t i = -99;
    assert((unsigned int)i == UINT_MAX + i + 1);

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ex-technicien-coloriste
    Inscrit en
    décembre 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ex-technicien-coloriste

    Informations forums :
    Inscription : décembre 2013
    Messages : 24
    Points : 14
    Points
    14

    Par défaut

    Wow! c'est assez tripan comme conversion.

    Donc ma valeur convertie dans mon cas est égal à (2^32 - 1 -99 +1) (ce ne serait pas plutôt (2^16 - 1 -99 +1) , vue que je compare à un uint16?) , ce qui donne un résultat énorme pour une raison qui m'échappe encore :/ .

    Merci en tout cas, ça m'éclaire sur ce point.

  4. #4
    Expert confirmé
    Inscrit en
    mars 2005
    Messages
    1 426
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 426
    Points : 4 166
    Points
    4 166

    Par défaut

    Dans le cas général, le type de 100u est unsigned int comme je l'ai précisé. Il existe probablement des plate-formes où ce type est confondu avec uint16_t mais c'est faux pour les architectures 64-bit, notamment.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 6 999
    Points : 19 872
    Points
    19 872
    Billets dans le blog
    1

    Par défaut

    Bonjour
    Citation Envoyé par Batfly Voir le message
    Donc ma valeur convertie dans mon cas est égal à (2^32 - 1 -99 +1) (ce ne serait pas plutôt (2^16 - 1 -99 +1) , vue que je compare à un uint16?)
    Je pense que les calculs/comparaisons se font quand-même tous en 32 bits.

    Mais au lieu de comparer, pourquoi n'affiches-tu pas directement X ? Avec tous les formats possibles "%d", "%u", "%hd", "%hu", "%ld", "%lu"...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ex-technicien-coloriste
    Inscrit en
    décembre 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ex-technicien-coloriste

    Informations forums :
    Inscription : décembre 2013
    Messages : 24
    Points : 14
    Points
    14

    Par défaut

    En effet, les information sont beaucoup plus clair en voyant les résultat sous les autres format, suis-je bête ^^ .

    mais à la base, c'était surtout pour comprendre un code un poil plus complexe qui utilisait cette condition et qui retournait (forcément) une erreur quand on insérait une valeur négative.

    merci, je marque ce soucis comme résolu!

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

Discussions similaires

  1. [VBA-E] macro qui se lance avec un commandbutton
    Par ricachu dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/07/2006, 09h52
  2. MDE qui s'ouvre avec la touche "Shift" !
    Par @rkane dans le forum Access
    Réponses: 12
    Dernier message: 28/06/2006, 09h16
  3. Qu'est ce qui se passe avec ce code ??
    Par adlich dans le forum Syntaxe
    Réponses: 2
    Dernier message: 30/04/2006, 12h04
  4. fenètre qui s'ouvre avec un bouton formulaire
    Par nickg dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/02/2006, 22h54
  5. Gérer ce qui se lance avec linux
    Par Harry dans le forum Mandriva / Mageia
    Réponses: 7
    Dernier message: 26/07/2004, 16h05

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