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.