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 :

Transtypage trés étrange


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut Transtypage trés étrange
    Bonjour,

    Je ne comprend pas le comportement des lignes suivantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int a=-1234;
    printf("%d",(unsigned int)a);
    J'obtient -1234
    Je m'attendais à un nombre positif, il y a quelque chose qui m'échappe là!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par uriotcea Voir le message
    il y a quelque chose qui m'échappe là!
    Oui, le fait que %d considère que ta variable est un entier signé.
    Pour le non signé, c'est %u:
    Remarque: printf est une fonction du C, pense à utiliser std::cout du C++, de même pour le cast:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout<<static_cast<unsigned int>(a);

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    La conversion (unsigned int)a ne change pas la valeur de a mais demande à l'interpréter comme un unsigned int. Sauf que la valeur, transmise à la fonction printf est interprétée par cette dernière comme un int, ce que dit %d.

    Bref cette conversion ne sert à rien.

  4. #4
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Ok merci pour vos remarques, mais en definitif comment dois-je m'y prendre alors pour que cela fonctionne. abs(a) ?
    D'un point de vue plus général, je me demande aussi en à quoi sert le transtypage ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ben Winjerome t'a donné la réponse.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    De manière générale:

    Le fait que tu utilise %d et non %u pour ton printf va forcément déjà intervenir sur la valeur que tu obtiendras à l'affichage, et c'est donc un problème "à part".

    Pour le reste, seul le contexte dans lequel le code apparait pourra te donner une raison quant au transtypage, et sans doute t'éclairer sur les risques éventuels qu'il peut y avoir à l'effectuer.

    Dans certains cas, tu sera tenté d'effectuer un transtypage "uniquement" pour éviter les avertissements de la part du compilateur (si tu essaye de comparer une valeur avec la valeur obtenue par la fonction size() d'une collection de la STL, par exemple)

    Dans d'autres cas, ton souhait est, simplement, de "forcer" ta valeur à être dans une plage donnée (si tu veux afficher une adresse mémoire, par exemple, tu peux préférer l'afficher sous une forme non signée, pour n'avoir que des adresses supérieures à 0)

    Le tout sans compter l'ensemble des raisons qui font que, à un moment donné, tu puisses préférer avoir affaire à un entier non signé

    Mais il faut être conscient que, à moins d'avoir de très bonnes raisons de le faire, le transtypage reste toujours une "pratique à risques", surtout si tu l'effectue "à la hussarde", à la mode C :

    En effet, tant que tu essayeras de convertir des types présentant des plages de valeurs similaires ou compatibles (char avec unsigned char ou plus gros, int avec unsigned int ou plus gros, ...), tu pourras envisager de travailler "plus ou moins sereinement", mais, si d'aventure tu en viens à essayer de transtyper un type "trop gros" pour le type de destination (ex : un long long en unsigned int), tu te prépare une foule de problème, "simplement" parce que la valeur résultante est très facilement susceptible d'avoir... perdu des données par rapport à la valeur d'origine!
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Salut,

    Tu sembles confondre le transtypage et retours de fonction.

    Ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a = -1234; // a = 0xfffffb2e
    unsigned int b = static_cast<unsigned int> ( a ); // b = 0xfffffb2e
    dit seulement au PC : les 4 octets de b contiennent la même valeurs binaire que les 4 octets de a, mais il faut traiter b comme un entier non signé

    Et celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a = -1234; // a = 0xfffffb2e
    unsigned int b = abs ( a ); // b = 0x000004d2
    fait que b contient la valeur absolue de a qui est le retour de la fonction abs et qui est une valeur positive. Ici la valeur binaire qui est dans les 4 octets de b est différente de celle de a. De plus, le retours de abs étant un int, le compilateur effectue une conversion implicite de int vers unsigned int pour affecter cette valeur à b

Discussions similaires

  1. Très étrange.. Bug impression etat
    Par Invité dans le forum Access
    Réponses: 2
    Dernier message: 01/08/2006, 11h44
  2. [HTML] bug très étrange
    Par kivan666 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 21/07/2006, 12h13
  3. [Swing][Focus] petit soucis trés étrange
    Par estacado dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 13/02/2006, 22h57
  4. Probleme très étrange mais pourtant si simple ! (Alias)
    Par Artanis dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/05/2005, 19h56
  5. Problème très étrange...
    Par TitiFr dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/03/2005, 21h37

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