J'essaie de passer du gros boutiste au petit boutiste sur un double. Une façon de faire est d'utiliserÉchange de bits en C++ pour un double
double val, tmp = 5.55;
((unsigned int *)&val)[0] = ntohl(((unsigned int *)&tmp)[1]);
((unsigned int *)&val)[1] = ntohl(((unsigned int *)&tmp)[0]);
Mais je reçois un avertissement: « pointeur de type punned déréférencement brisera des règles strictes-aliasing » et je ne veux pas tourner cet avertissement au large.
Une autre façon de faire est:
#define ntohll(x) (((uint64_t)(ntohl((uint32_t)((x << 32) >> 32))) << 32) | ntohl(((uint32_t)(x >> 32))))
val = (double)bswap_64(unsigned long long(tmp)); //or
val = (double)ntohll(unsigned long long(tmp));
Mais alors perdre les décimales. Quelqu'un sait-il un bon moyen d'échanger les bits sur un double sans utiliser une boucle for?
Si vous faites cela en C++, je crois que vous devriez éviter les lancers de style C. – ereOn
J'ai eu un problème similaire hier, vous pourriez être intéressé par la réponse (http://stackoverflow.com/questions/2667225/endianness-conversion-and-g-warnings) –
J'ai vérifié la réponse à votre question et la solution est ok pour moi, merci – hidayat