En C, il faut faire très attention
1) au type d'une variable (signed/unsigned)
2) à la façon dont tu affiches une variable (%d %u)
Tu remarques que dans "ffffffbc" il y a bien "bc". Mais ce "bc" (1011 1100) a le premier bit (bit de signe) à "1". En plus, "*pt" est un "char" donc un "signed char".
Donc, quand le compilo voit que tu affiches un "signed char" au format "%x" (format d'un entier affiché en hexa), il transforme automatiquement "(signed char)bc" en "(signed int)bc".
Or, quand un nombre négatif est transformé en nombre d'un type plus large, le bit de signe s'il est à "1" est automatiquement recopié pour conserver cette négativité.
Exemple: "-16" en char vaut "1111 0000". Mais si tu recopies ce "-16" dans un "int" et que tu veux conserver sa valeur, il faut alors étendre le bit de signe et cela donne "1111 1111 1111 0000" (toujours égal à -16)
Donc ici, comme le compilo croit que tu travailles avec un nb négatif qu'il est forcé de conserver, il passe automatiquement de "1011 1100" à "1111 1111 1011 1100"
Si tu veux en avoir la preuve, tape "364" au lieu de "444". "364" s'écrit "16C" en hexa et "6C" s'écrit "0110 1100" => là, le bit de signe vaut "0" donc il ne sera pas étendu et "0110 1100" restera "0000 0000 0110 1100" quand il sera transformé en "int"
Pour en revenir à ton pb, déclare "pt" comme "unsigned char*" et cela devrait aller... ou alors fait
printf("%x", (unsigned char)*(pt + i));
PS: Je ne connaît pas l'option "%i" de printf...
Poste le Saturday 4 June 2005 16:06:00