J'ai dans des numéros hexagonaux de langue définis dans la chaîne: puis je veux comparer les valeurs avec une autre. Il ne fonctionne pas et si j'imprime la valeur comme: p> Il écrit fffffffb code>. Pourquoi est-ce et comment obtenir
fb code> valeur exactement? P> p>
3 Réponses :
Ceci est dû à l'extension de signe.
modifier p> à p> le spécificateur de format Resend ceci pour plus de détails extension de signe p> si vous auriez déclaré % x code> sera lu < Code> 4 octets code> sur la machine 32bit. Comme vous avez déclaré
caractères code> comme tableau de caractères, lors de la récupération de la valeur
fb code> (valeur négative) sera un signe étendu comme
fffffffb code>, où le MSB de
fb code> est défini sur tous les autres bits avant de cela. p>
Chars caractères [] code> comme
non signé caractère caractères [] code> alors le L'impression aurait été comme prévu. p> p>
C'est à cause de l'extension du signe.
Cela fonctionnera comme vous attendez: p>
selon la norme de mention concernant le spécificateur de format L'argument Int non signé est converti en octal non signé ( donc, le type d'argument attendu sur maintenant, il invoque non défini Comportement . P> FWIW, si vous rencontrez un compilateur pris en charge C99, vous pouvez utiliser le modificateur % x code> avec
fprintf () code>
o, u, x, x code> p>
% x code> est
non signé INT code>. p>
printf () code> être une fonction variadique, seule la règle de promotion par défaut est appliquée à ses arguments. Dans votre code,
caractères code> être un tableau de type
Char code> (Signité dont la mise en œuvre dépend de la mise en œuvre), dans le cas de p>
caractères [0] code> est promu à un
int code> qui n'est pas le type attendu pour
% x code>. Par conséquent, la sortie est incorrecte, comme
int code> et
non signé int code> ne sont pas le même type. [Reportez-vous §6.7.2,
C11 CODE>]. Donc, sans couler explicite comme p>
HH code> pour contourner ce problème, comme p >
printf("%02hhx\n", (unsigned char)chars[0]);
[Sidenote mineur]: Je pense qu'il existe un consensus commun entre les développeurs C, que % x code> Specififier est valide pour
int code> objet, qui contient non négatif < / i> valeur. Par exemple
{int i = 100; printf ("% x \ n", i); } code> est acceptable, même si le type n'est pas
non signé INT code>. Mais, strictement de parler, c'est UB, non?
@Grzegorzszpetkowski Oui, c'est ce que je sais. :-)
Lorsque vous travaillez avec des données binaires, vous souhaitez toujours utiliser
non signé Char code>. Je changerais la déclaration plutôt que d'ajouter des mises.