7
votes

Impression de la valeur hexagonale stockée sous forme d'une chaîne donne une sortie inattendue

J'ai dans des numéros hexagonaux de langue définis dans la chaîne: xxx

puis je veux comparer les valeurs avec une autre. Il ne fonctionne pas et si j'imprime la valeur comme: xxx

Il écrit fffffffb . Pourquoi est-ce et comment obtenir fb valeur exactement?


1 commentaires

Lorsque vous travaillez avec des données binaires, vous souhaitez toujours utiliser non signé Char . Je changerais la déclaration plutôt que d'ajouter des mises.


3 Réponses :


6
votes

Ceci est dû à l'extension de signe.

modifier xxx

à xxx

le spécificateur de format % x sera lu < Code> 4 octets sur la machine 32bit. Comme vous avez déclaré caractères comme tableau de caractères, lors de la récupération de la valeur fb (valeur négative) sera un signe étendu comme fffffffb , où le MSB de fb est défini sur tous les autres bits avant de cela.

Resend ceci pour plus de détails extension de signe

si vous auriez déclaré Chars caractères [] comme non signé caractère caractères [] alors le L'impression aurait été comme prévu.


0 commentaires

0
votes

C'est à cause de l'extension du signe.

Cela fonctionnera comme vous attendez: xxx


0 commentaires

2
votes

selon la norme de mention concernant le spécificateur de format % x code> avec fprintf () code>

o, u, x, x code> p>

L'argument Int non signé est converti en octal non signé ( O fort>), non signé décimal ( u strong>), ou notation hexadécimale non signée (x ou x) forte> dans le style dddd em>; [...] p> blockquote>

donc, le type d'argument attendu sur % x code> est non signé INT code>. p>

maintenant, 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> xxx pré> La valeur de 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> xxx pré>

il invoque non défini Comportement . P>

FWIW, si vous rencontrez un compilateur pris en charge C99, vous pouvez utiliser le modificateur HH code> pour contourner ce problème, comme p >

 printf("%02hhx\n", (unsigned char)chars[0]);


2 commentaires

[Sidenote mineur]: Je pense qu'il existe un consensus commun entre les développeurs C, que % x Specififier est valide pour int objet, qui contient non négatif < / i> valeur. Par exemple {int i = 100; printf ("% x \ n", i); } est acceptable, même si le type n'est pas non signé INT . Mais, strictement de parler, c'est UB, non?


@Grzegorzszpetkowski Oui, c'est ce que je sais. :-)