Truc en c s'il vous plaaait

Résolu
DevGl Messages postés 151 Statut Membre -  
DevGl Messages postés 151 Statut Membre -
Bonjour,
je suis entrain de programmer en c , et un petit truc qui est assez simple m'a vrement cassé la tete , et je voulais vous demander de m'aider ,
par exemple j'ai l'instruction suivant :

char a=0xAA;
printf("R1 =%d R2=%d\n", 0xAA, a);

personelement j'ai cru que résultat soit : R1 = -86 R2 = -86
mais quand j'ai essayé ca en devc++ , Résultat etait ; R1=170 R2=-86
mais ou est le probleme dans ca ??? a=0xAA , donc a est 0XAA sont les meme !! pour quoi cette difference la :/ ?????

1 réponse

fiddy Messages postés 11653 Statut Contributeur 1 847
 
Bonjour,
0xAA vaut 170. Donc si tu affiches 0xAA tu auras 170.
En revanche, si tu stockes 0xAA dans un char signé, cela risque de poser problème car le nombre maximum est dépassé (en supposant qu'il soit stocké sur 8 bits).
Explication :
0xAA = 10101010 en binaire.
On suppose que ton char est sur 8 bits.
char a=0xaa = 1 0101010 (le premier chiffre sert pour déterminer le signe) car il s'agit d'un char signé (par opposition à unsigned char).
Il faut utiliser le complément à 2 (et rajouter 1) pour déterminer le nombre négatif.
0101010 en complément à 2 vaut : 1010101 (on inverse les 0 et 1).
Si on rajoute 1, ça donne : 1010110 ce qui donne : 86.
Ce qui fait -86.

Cdlt,
0
DevGl Messages postés 151 Statut Membre
 
ouui je sais que a = 0XAA c 'est a dire a = -86 , mais comment t'as trouvé que 0XAA = 170 ???? c'est ce ce que je n'ai pas compris Fiddy !!
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
0xAA, c'est de l'hexadécimal.
Cela vaut en décimal : 0*16+10 = 170.
0
DevGl Messages postés 151 Statut Membre
 
ouui ouuuuuuuuuui , saye j'ai compris , merci beaucoup Fiddyyyyyyyy !!
0