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 :

Printf affiche mal l'héxadécimal


Sujet :

C

  1. #1
    Membre régulier Avatar de DJ Caësar 9114
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 134
    Points : 81
    Points
    81
    Par défaut Printf affiche mal l'héxadécimal
    Bonjour à tous.
    J'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (l=0;l<8;l++) {printf("%02X ",a.c[l]);}
    dans un de mes programmes, et j'obtiens comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    56 FFFFFFE2 0A FFFFFFE5 21 FFFFFFD9 FFFFFF87 08
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    printf("\nBinaire: ");
    b.l=1;
    for (l = 0; l<=63; l++)
      {
        if ((b.l & a.l)==b.l) {printf("1");}
        else printf("0");
        if ((l%m)==m-1) {printf(" ");}
        b.l <<= 1;
      }
    me donne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    01101010 01000111 01010000 10100111 10000100 10011011 11100001 00010000
    ma question est donc: d'où viennent ces "FFFFFF" si niveau binaire tout se passe bien?

    Merci beaucoup

  2. #2
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Cesar9114
    ma question est donc: d'où viennent ces "FFFFFF" si niveau binaire tout se passe bien?
    Certainement parceque ton entier est signé. Essayes de changer le type de a.c[] en "unsigned int".

  3. #3
    Membre régulier Avatar de DJ Caësar 9114
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 134
    Points : 81
    Points
    81
    Par défaut
    effectivement, l'ajout de (unsigned char) devant a.c fonctionne. mais je voudrais quand même savoir, pour ma culture personnelle () pourquoi je vois un "FFFFFF", qui n'a rien à faire ici.

  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 Cesar9114
    effectivement, l'ajout de (unsigned char) devant a.c fonctionne. mais je voudrais quand même savoir, pour ma culture personnelle () pourquoi je vois un "FFFFFF", qui n'a rien à faire ici.
    Les types char et short sont promus en int par printf(). C'est automatique, on y peut rien.

    Comme sur ta machine, le codage des nombres signés est 'complément à 2', les bit de poids fort est 'étendu' sur toute la partie haute du nombre. En effet :

    -128 se code 0x80 dans une char de 8-bit, mais FF80 dans un int de 16-bit et FFFF80 dans un int de 32-bit.

    Il faut donc se prémunir de l'extension de signe. Pour ça :

    (unsigned char) pour convertir le char en non signé précédé de (unsigned) parce que %x attend un unsigned.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
     
    int main (void)
    {
       signed char x = -128;        /* pire des cas */
     
       printf ("x = %02X\n", x);
       printf ("x = %02X\n", (unsigned char) x);
       printf ("x = %02X\n", (unsigned) (unsigned char) x);
     
       return 0;
    }

Discussions similaires

  1. [SQL] Les caractère accentués s'affichent mal après une requête SQL
    Par sayerh dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/03/2008, 11h56
  2. [FPDF] Caractères spéciaux s'affichent mal en pdf
    Par Damien R dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/01/2008, 10h57
  3. Cellule transparente s'affiche mal sous FF
    Par Luke58 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 25/05/2007, 12h24
  4. Réponses: 3
    Dernier message: 24/10/2006, 11h56
  5. requete affiche mal
    Par larpe dans le forum Access
    Réponses: 3
    Dernier message: 31/05/2006, 08h29

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