Я пытаюсь изменить порядок байтов с прямого на прямой на двойном. Один из способов - использовать
double val, tmp = 5.55;
((unsigned int *)&val)[0] = ntohl(((unsigned int *)&tmp)[1]);
((unsigned int *)&val)[1] = ntohl(((unsigned int *)&tmp)[0]);
Но затем я получаю предупреждение: «разыменование указателя с типизированным каламбуром нарушит строгие правила сглаживания», и я не хочу отключать это предупреждение.
Другой способ:
#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));
Но тогда потерять десятичные дроби. Кто-нибудь знает хороший способ поменять местами биты на двойном без использования цикла for?