6
votes

Double des longs morceaux

J'ai un non signé long long long (ou uint64_t ) et souhaitez le convertir en un double . Le double doit avoir le même motif de bits que la valeur . De cette façon, je peux définir les bits de la double "à la main". XXX

Je cherche un moyen de faire cela.


3 commentaires

Demandez-vous comment faire cela? Avoir du mal à analyser une question en dehors de cela.


En C99, vous pouvez le faire légalement via une union. En C ++, vous devez le faire en utilisant un memcpy () .


If'n yer se sentir comme bein 'un dangereux badboy, yer outil o' choisir serait quelque chose comme un Ceci ici coulé, jeune feller.


3 Réponses :


6
votes

Méfiez-vous de Union et Reterpret_cast (& bits) , car ces deux méthodes sont UB. À peu près tout ce que vous pouvez faire est MEMCY.


1 commentaires

@Saksham Oui, par "UB", cela signifie un comportement indéfini.



16
votes

Le moyen portable de le faire est avec memcpy (vous pouvez également être capable de le faire conditionnellement avec Reterpret_cast ou un syndicat, mais ceux-ci ne sont pas certains d'être portable parce qu'ils violent la lettre des règles strictes-alias): xxx

Mais avant de vous assurer de savoir exactement ce que vous faites et quelle représentation de point flottante est utilisée (bien que IEEE754 est un choix populaire / courant). Vous voudrez éviter toutes sortes de valeurs problématiques telles que l'infini, le NAN et les nombres de dénigrement.


2 commentaires

Merci pour l'explication.


Je crois que la norme vous permet de "réinterpret_cast (bits)" dans ce cas, car les deux types sont la disposition standard, en supposant que le double ne nécessite pas d'alignement plus strict.



-3
votes

Ce qui suit utilise un pointeur vide. xxx


3 commentaires

Une violation aliasante stricte des comportements non définis. C'est la même chose que la réponse de Dasblinkenlight mais avec un temporaire totalement inutile.


Je savais que ma réponse est la même que celle de Dasblinkenlight, mais comme elle utilise une syntaxe complètement différente, elle semble être une méthode différente. Ainsi, j'ai pensé qu'il était approprié de poster comme une réponse à la question. Et comme pour le fait qu'il s'agisse d'un comportement indéfini, je ne connais pas d'un compilateur ou d'un système incapable de faire face à celui-ci (à condition que les deux variables soient de la même taille).


L'ajout du temporaire est totalement inutile, la méthode est identique. En outre, c'est un comportement indéfini, et c'est ça.