Affichage printf (valeur hexa) étrange :S

Neptis -  
Mahmah Messages postés 497 Statut Membre -
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
A voir également:

4 réponses

mich62120 Messages postés 636 Statut Membre 6
 
Et si t'initialise somme=0x000;?
0
Neptis
 
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
FloMo
 
Essaye ceci :

somme = (unsigned int)0x000000ff & (unsigned int)somme;
printf("%x\n", somme);
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
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 497 Statut Membre 125
 
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