0
votes

Différence entre écrire un entier dans un hexagonible d'un vrai

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.

pour les entiers que j'utilise: printf ("% # x", d);

pour les réels que j'utilise: printf ("% # lx", r);

Si j'entraîne 12 , premières impressions: 0xc

Si j'entraîne 12.0 , secondes impressions: 0x4028000000000000

Pouvez-vous expliquer quelle est la différence et comment cela est calculé?


6 commentaires

Le format % x est pour entiers , pas pour les valeurs de point flottant. Le spécificateur de format incompatible et le type d'argument conduit à comportement non défini .


La différence est que 12 est un entier et 12.0 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 , votre implémentation C a accès à ces bits et formatez-les à l'affichage. Ceci est pas 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 nommé x , étant donné que votre implémentation C utilise ce format pour double , inclure le Headers , , et < / code> et utiliser uint64_t u; memcpy (& u, & x, taille de u); printf ("% 0x016" Prix64 "\ n", u); .


@sam Pour convertir le codage de tout objet à HEX peut être effectué avec une modification de pour convertir toute variable / objet à une chaîne qui emploie binaire.


3 Réponses :


2
votes

Le spécificateur de format x Attend un int ou non signé int argument. Avec le modificateur l Il attend un long ou non signé long int argument. Si vous l'appelez avec quelque chose d'autre (tel qu'un double ), vous obtenez un comportement indéfini.

Si vous souhaitez imprimer un float hexagonal (avec des lettres majuscules), utilisez le format % A , lequel pour 12.0 imprimera 0x1.8p + 3 - 1 et demi; × 2 3


4 commentaires

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 ou le codage du numéro?


@ CHUX-RELERSTATEMONICA CODING du nombre



0
votes

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.


Les passes ci-dessous L'adresse de l'objet et sa taille pour former une chaîne pour l'impression. xxx

sortie xxx

avec des objets plus complexes , la sortie peut inclure des bits / octets de rembourrage et la sortie est sensible à Endian.


0 commentaires

2
votes

impression double code> valeur r code> à l'aide de format % # lx code> a réellement un comportement indéfini.

Vous avez eu la chance d'obtenir le 64- bits qui représentent la valeur 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> xxx pré>

mais tapez 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 code> et le format de conversion de code>: p>

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


0 commentaires