Spécificateur de format pour les caractères hexadécimaux en C
-
12-12-2019 - |
Question
Existe-t-il un spécificateur de format pour sprintf
en C qui mappe un char
lancer un sort de la même manière que %x
cartographie un int
lancer un sort ?
La solution
Oui et non.
Depuis sprintf
prend une liste d'arguments variable, tous les arguments subissent une promotion par défaut avant sprintf
les reçoit.Cela signifie sprintf
volonté jamais recevoir un char
-- un char
sera toujours promu au rang int
avant sprintf
le reçoit (et un short
le sera également).
Oui, depuis quoi sprintf
reçoit sera un int
, vous pouvez utiliser %x
pour le convertir au format hexadécimal, et cela fonctionnera de la même manière si cette valeur a commencé comme un char
, short
, ou int
.Si (comme c'est souvent le cas) vous souhaitez imprimer 2 caractères pour chaque entrée, vous pouvez utiliser %2.2x
.
Attention cependant à un point :si ton char
est signé et que vous démarrez avec une valeur négative, la promotion à int
produira la même valeur numérique, qui normalement ne le fera pas être le même modèle de bits que le caractère d'origine, donc (par exemple) un caractère avec la valeur -1
s'imprimera normalement comme ffff
si int
est de 16 bits, ffffffff
si int est de 32 bits, ou ffffffffffffffff
si int
est de 64 bits (en supposant la représentation typique du complément à 2 pour les entiers signés).
Autres conseils
C'est la meme chose %x
.Tous char
les valeurs sont converties en int
avant d'être transmis à sprintf
(ou toute autre fonction prenant un nombre variable de paramètres).
printf("%x\n", 'a');
impressions 61