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 :

question sur l'hexadécimal


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut [résolu]*question sur l'hexadécimal
    On considère que l'implémentation code les caractères sur 8 bits

    Premier exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      int n ;
      signed char c ;
      c = '\xfe' ;
     
      n  = c+ 1 ;
      printf("%d", n) ;
    Ici, on obtient -1 et là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      int n ;
      unsigned char c ;
      c = '\xfe' ;
     
      n  = c+ 1 ;
      printf("%d", n) ;
    on obtient 255. Je ne comprends pas pourquoi et surtout comment on en est arrivé à ces deux résultats différents.

  2. #2
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut FF = -1
    C'est parceque lorsque tu es en unsigned, tu peux aller de 0 (00) à 255 (FF )et lorsque tu es en signed de 0 (00) à 127 (7F). Ensuite tu passes en négatif et FF = -1.

    Si le bit de poids fort est supérieur à 7, alors tu es en négatif.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Et quand on "passe ensuite en négatif", on peut aller jusqu'à -128 ?
    C'est la meme chose pour les dépassements de capacités ?
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n =60000 ;
    printf("%d", n) ;

  4. #4
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Quand t'es en signed, tu peus aller de -128 à +127
    Sinon, pour les dépassement de capacité, je crois que le C le gère d'une facon particulière et il me semble qu'il ne sort pas n'importe quoi...il semble qu'il fait un calcul que je ne me rapelle plus trop.
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  5. #5
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    ce qui est identique dans les 2 cas, c'est FE+1 = FF

    là ou intervient la différence, c'est la conversion du résultat vers int

    signed char --> int ============> FF --> FFFFFFFF

    unsigned char --> int ============> FF --> 000000FF

  6. #6
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Tout est fait au niveau du cast (implicite) n=c+1
    tu peux meme faire c++; puis n=c;. Dans cette conversion
    unsigned/signed char -> (signed) int, il prend en compte ou non le signe de c.

    Pour le debordement de capacite, c'est le calcul "normal" des addition.
    0x7F + 0x01 = 0x80. Ce qui donne en (8bits) signe 127+1=-128. Il y a la un debordement. Evidement on ne te dis rien, c'est silentieux.
    Pour un debordement non signe, tu as 0xFF + 0x1 = 0x00. (255+1=0).

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Ok, pour le post de D[r]eadLock, je pense que j'ai compris, mais ce que je n'assimile toujours pas c'est pourquoi :

    signed char --> int ============> FF --> FFFFFFFF

    unsigned char --> int ============> FF --> 000000FF

    Peut on m'expliquer ce qui se passe réellement ?

    En tout cas, merci pour votre aide

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Adrael
    Ok, pour le post de D[r]eadLock, je pense que j'ai compris, mais ce que je n'assimile toujours pas c'est pourquoi :

    signed char --> int ============> FF --> FFFFFFFF

    unsigned char --> int ============> FF --> 000000FF

    Peut on m'expliquer ce qui se passe réellement ?

    En tout cas, merci pour votre aide
    Tout simplement parce que la conversion de type ne recopie pas betement les bits, mais les interpretes afin de onserver, si possible, la valeur correcte. Or si une variable en signed char vaut FF, c'est a dire -128, elle vaudra aussi -128 en int soit FFFFFFFF. Par contre en unsigned char elle vaudra 255 donc apres la conversion l'int aura la valeur 255 soit 000000FF.

  9. #9
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut nombres négatifs
    Citation Envoyé par gl
    Tout simplement parce que la conversion de type ne recopie pas betement les bits, mais les interpretes afin de onserver, si possible, la valeur correcte. Or si une variable en signed char vaut FF, c'est a dire -128, elle vaudra aussi -128 en int soit FFFFFFFF. Par contre en unsigned char elle vaudra 255 donc apres la conversion l'int aura la valeur 255 soit 000000FF.
    Ce qu'il faut retenir, c'est que c'est le bit de poids fort qui donne le signe du nombre. Si le bit de poids fort est supérieur ou égal à 8 alors le nombre est négatif.

    7F > 0
    80 < 0

    0000007F > 0
    0000008F >0

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Merci de vos réponses.

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

Discussions similaires

  1. Question sur l'hexadécimal
    Par nicolas66 dans le forum C++
    Réponses: 5
    Dernier message: 18/08/2006, 21h24
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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