On m'a donné une tâche à l'université, il y a un numéro et j'ai besoin de l'afficher en hexagone tel qu'il est présenté sur l'ordinateur. J'ai écrit un programme de traduction d'entiers signés. Et j'ai également trouvé une entrée de nombres réel dans Hex. Mais c'est différent de l'habituel. P>
pour les entiers que j'utilise: pour les réels que j'utilise: Si j'entraîne Si j'entraîne Pouvez-vous expliquer quelle est la différence et comment cela est calculé? P> printf ("% # x", d); code> p>
printf ("% # lx", r); code> p>
12 code>, premières impressions:
0xc code> p>
12.0 code>, secondes impressions:
0x4028000000000000 code> p>
3 Réponses :
Le spécificateur de format code> x code> Attend un Si vous souhaitez imprimer un float hexagonal (avec des lettres majuscules), utilisez le format int code> ou
non signé int code> argument. Avec le modificateur
l code> Il attend un
long code> ou
non signé long int code> argument. Si vous l'appelez avec quelque chose d'autre (tel qu'un
double code>), vous obtenez un comportement indéfini. P>
% A code>, lequel pour 12.0 imprimera
0x1.8p + 3 code> - 1 et demi; × 2 3 sup> p>
Je me suis confus. Parce que dans mes recherches sur Internet, j'ai trouvé Sites . Il se traduit de la même manière que ce code. Votre solution fonctionne, mais dans ma tâche, il est écrit pour imprimer 4 entiers dans Hex, qui constituent une représentation de ce nombre. À mon avis, 0x1p + 0 n'est pas tout à fait ce dont vous avez besoin, ou je me suis trompé?
Ce site montre la conversion entre les bits et la représentation du flotteur IEEE754, qui peut être ce que votre ordinateur utilise (la plupart de ces jours).
@sam voulez-vous imprimer la valeur i> ou le codage i> du numéro?
@ CHUX-RELERSTATEMONICA CODING B> du nombre
Pour produire le codage d'un numéro dans HEX est un vidage de mémoire simple. Le processus n'est pas si différent parmi les types. P> Les passes ci-dessous L'adresse de l'objet et sa taille pour former une chaîne pour l'impression. p> sortie p> avec des objets plus complexes , la sortie peut inclure des bits / octets de rembourrage et la sortie est sensible à Endian. P> P>
impression Vous avez eu la chance d'obtenir le 64- bits qui représentent la valeur mais tapez double code> valeur
r code> à l'aide de format
% # lx code> a réellement un comportement indéfini.
12.0 code> en tant que
double code>, sauf si
r code> a type
non signé long code> et a été initialisé à partir de la valeur
12.0 code> de cette façon: p>
non signé long code> n'a pas 64 bits sur toutes les plateformes, en effet il fait Pas sur l'Intel Abi 32 bits. Vous devez utiliser le type
uint64_t code> à partir de
int: 0XC [ 0C 00 00 00 ]
double: 0X4028000000000000 [ 00 00 00 00 00 00 28 40 ]
sign bit: 0
exponent: 1026
mantissa: 0X8000000000000, 1.50000000000000000
Le format
% x code> est pour entiers i>, pas pour les valeurs de point flottant. Le spécificateur de format incompatible et le type d'argument conduit à comportement non défini i>.
La différence est que
12 code> est un entier et
12.0 code> est un numéro de point flottant dont la représentation binaire suit IEEE 754 .
"0x4028000000000000" est une représentation hexadécimale des bits qui codent 12 dans le format Binary64 IEEE-754. Il a été imprimé car, bien que vous utilisiez de manière incorrecte
printf code>, votre implémentation C a accès à ces bits et formatez-les à l'affichage. Ceci est pas b> la façon dont vous devez afficher la représentation des nombres à virgule flottante.
Avec ce suivant votre question précédente, il semble que vous essayiez d'imprimer des nombres de points flottants dans un format hexadécimal. Mais nous ne savons pas quoi. Dire que c'est "hex" n'est pas suffisamment informatif. Les chiffres tels que 6 + 7/16 + 13/256 peuvent être écrits en hexadécimal tels que 6,7D, où la notation est la même que celle utilisée pour des nombres décimaux, à l'exception de la base de 16 au lieu de dix. Ou nous pouvons utiliser IEEE-754 Binary64 pour encoder le numéro dans un format spécial de 64 bits, puis nous pouvons afficher ces bits en utilisant Hexadecimal. Si vous souhaitez aider à afficher le numéro, vous devez nous dire lequel de ceux-ci que vous voulez.
Pour imprimer en hexadécimal, le codage Binaire IEEE-754 Binary64 d'un
double code> nommé
x code>, étant donné que votre implémentation C utilise ce format pour
double code>, inclure le Headers code>, code>, code> et < / code> et utiliser
uint64_t u; memcpy (& u, & x, taille de u); printf ("% 0x016" Prix64 "\ n", u); code>.
@sam Pour convertir le codage de tout objet à HEX peut être effectué avec une modification de pour convertir toute variable / objet à une chaîne a > qui emploie binaire.