Im пытается переходить от большого endian к little endian на двойном. Один путь состоит в использованииSwap bits в C++ для двоичного кода
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?
Если вы делаете это на C++, я считаю, что вам следует избегать стилей C-стиля. – ereOn
У меня возникла аналогичная проблема вчера, вас может заинтересовать ответ (http://stackoverflow.com/questions/2667225/endianness-conversion-and-g-warnings) –
Я проверил ответ на ваш вопрос, и решение хорошо для меня, спасибо – hidayat