Affichage printf (valeur hexa) étrange :S
Neptis
-
Mahmah Messages postés 497 Statut Membre -
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
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:
- Printf hexa
- Editeur hexa - Télécharger - Édition & Programmation
- Code ascii hexa - Guide
- Printf FLags ✓ - Forum C
- Printf tableau - Forum C
- Hexa en c - Forum C
4 réponses
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
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.
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.
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é.
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...
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...