Affichage printf (valeur hexa) étrange :S

Fermé
Neptis - 23 févr. 2008 à 19:29
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 - 30 juil. 2008 à 11:05
Bonjour,

Je travaille actuellement sur un petit programme en langage C me permettant simplement d'obtenir un checkSum pour un message à envoyer. La règle de ce calcul est simple c'est Somme=0x100-(taille+le code+la donnée 1 +la donnée 2).
Le problème c'est que l'affichage de la réponse est : ffffffDE alors que je devrais obtenir : DE

Voici par exemple le code que je réalise :

int main (void)
{
int taille, code, donnee[256], somme;

taille=0x02;
code=0x20;
donnee[0]=0x80;
donnee[1]=0x80;
somme = 0x100-(taille+code+donne[0]+donnee[1]);
printf("%x",somme);
}

(Avec ce programme j'obtiens : ffffffDE alors que je devrais obtenir : DE ).

Merci d'avance pour votre aide :)

Neptis

4 réponses

mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
23 févr. 2008 à 20:10
Et si t'initialise somme=0x000;?
0
Ca ne change rien :/ Apparement c un problème du printfki utilise des unsigned mais g beau faire des casts ou tester avec des unsigned ça ne change rien :S
0
Essaye ceci :

somme = (unsigned int)0x000000ff & (unsigned int)somme;
printf("%x\n", somme);
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 juil. 2008 à 10:40
Moi, je sais !! Tu ne sais tout simplement pas faire une addition.
100-(2+20+80+80)=100-122 <0 !
Test avec la calculatrice windows en mode hexadécimal pour t'en convaincre !
FloMo, ta solution est... sans intéret, en forçant le résultat, c'est évident que tu va l'avoir.
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
30 juil. 2008 à 11:05
Bonjour,

En fait, 0xFFFFFFDE est un nombre négatif. (Qui provient du 0x100 - <plein de trucs>)

n = 0xFFFFFFDE
n - 1 = 0xFFFFFFDD
C1( n - 1) = 0x22 // = ~0xFFFFFFDD
n = -34

Comme ici on considère des nombres non signés on peut voir ça comme un tour de compteur :
0 = 0x00000000
0 - 1 = 0xFFFFFFFF // (Sur un entier 32 bits) on va dire 0xFF...FF
0 - 2 = 0xFFFFFFFE
etc.

De la même façon, 0xFFFFFFFF + 1 = 0 car sur un entier 32 bits, on dépasse le maximum possible.


taille=0x02;
code=0x20;
donnee[0]=0x80;
donnee[1]=0x80;

donc : pleinDeTruc = 0x122;
D'où 0x100 - 0x122 = - 0x22 = 0xFFFFFFDE.

Je soutiens la solution proposée par FloMo qui permet d'obtenir l'affichage désiré.
printf("%x\n", 0xff & somme);

C'est l'opération elle même qui n'est pas délicate. (ce qui ne veut pas dire que ce n'est pas celle que tu souhaites)
Pour un checksum léger ça peut être satisfaisant.

Ceci dit, le seul souci que je vois ici est dans :
(Avec ce programme j'obtiens : ffffffDE alors que je devrais obtenir : DE ).

256 - 290 = -34
0xDE = 222

Voilou,
M.



EDIT. : Ah bah oui, quand on fait deux choses en même temps répond en retard...
0