Forum Programmation.c hardcoder des octets

Posté par  .
Étiquettes : aucune
-1
20
fév.
2012

Pourquoi quand je fais :
char buffer[6] = { 0x33, 0x44, 0x00, 0x06, 0x12, 0x34 };
Le binaire représenté en base 16 est comme ceci : 334400061234

Alors que si je fais :
char buffer[6] = { 0xAB, 0xCD, 0x00, 0x06, 0x12, 0x34 };
Le binaire représenté en base 16 est comme ceci : ffffffabffffffcd00061234

Je m'attendais à avoir des résultats homogènes !

Merci pour vos explications...

  • # Précisions

    Posté par  . Évalué à 1.

    Précisions :
    J'utilise : gcc version 4.4.5 (Debian 4.4.5-8)

    Et si j'essaye '\xAB' au lieu de 0xAB, même résultat.

    • [^] # Re: Précisions

      Posté par  . Évalué à 3.

      quels méthodes utilises tu pour voire la représentation mémoire ?

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: Précisions

        Posté par  . Évalué à 0.

        Je m'étais en effet trompé dans mon printf d'affichage de la mémoire à cause du signe de l'entier.
        Je faisais en gros ceci : (int)(buffer[i])
        au lieu de (char)(buffer[i]).

        C'est résolu. Merci.

  • # Signed char

    Posté par  . Évalué à 10.

    Apparemment tes char sont signés donc toute valeur supérieur a 0x7f est considérée comme négative, et il doit y avoir une conversion char --> int quelque part dans ton programme.

  • # C'est l'extension de signe

    Posté par  . Évalué à 0.

    C'est le résultat de plusieurs phénomènes
    Le premier c'est l'extension de signe
    un char est signé donc le bit MSB indique que c'est positif ou négatif.
    Ainsi tout car supérieur à 0x7F est considéré comme négatif.
    Si le char en question est chargé dans un registre processeur alors le processeur procède à l'extension de signe sur tout les MSB jusuqu'a 32bits pour conserver la même représentation du chiffre négatif. (car un proc essaye toujours d'utiliser ces registres dans sont mode natif pour des raisons d'optimisation et qui sur les x86 est 32 bits)

    -1 sur 8 bits c'est 0xFF
    -1 sur 32bit c'est 0xFFFFFFFF

    Si tu travaillait en unsigned char tu aurais bien la même représentation en 8 bit qu'en 32bits de tes chiffres car les instructions assembleur utilisé serait ceux ne provoquant pas d'extension de signe.

    Le second phénomène c'est sans doute la méthodes que tu utilise pour obtenir ce que tu apelle le binaire en base 16 mais sans indication je ne peut pas expliquer ce qui se passe.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.