Vous ne pouvez pas obtenir (s) printf pour convertir 'F' en 255 sans magie noire. Printf convertira un caractère en d'autres représentations, mais ne changera pas sa valeur. Cela pourrait montrer comment fonctionne la conversion des caractères:
printf("Char %c is decimal %i (0x%X)\n", 'F', 'F', 'F');
printf("The high order bits are ignored: %d: %X -> %hhX -> %c\n",
0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46, 0xFFFFFF46);
produit
Char F is decimal 70 (0x46)
The high order bits are ignored: -186: FFFFFF46 -> 46 -> F
Ouais, je sais que vous avez parlé sprintf, mais cela ne vous montrer quoi que ce soit jusqu'à ce que vous faire une autre impression.
L'idée est que chaque paramètre entier générique à un printf est mis sur la pile (ou dans un registre) par promotion. Cela signifie qu'il est étendu à sa taille générique la plus grande: les octets, les caractères et les shorts sont convertis en int par extension de signe ou remplissage nul. Cela maintient la liste des paramètres sur la pile dans un état raisonnable. C'est une bonne convention, mais elle a probablement son origine dans l'orientation des mots sur 16 bits de la pile sur le PDP-11 (là où tout a commencé).
Dans la bibliothèque printf (à la réception de l'appel), le code utilise le spécificateur de format pour déterminer quelle partie du paramètre (ou la totalité de celui-ci) est traitée. Donc, si le format est '% c', seulement 8 bits sont utilisés. Notez qu'il peut y avoir des variations entre les systèmes sur la façon dont les constantes hexadécimales sont «promues». Mais si une valeur supérieure à 255 est transmise à une conversion de caractères, les bits de poids fort sont ignorés.
F = 15, FF = 255 –
Quelqu'un devrait renommer cela, il demande comment convertir hex un int, pas * un caractère char à sa représentation en octets * –
Fixe. Merci! :) – bobber205