我试图在double上从big endian变成little endian。去的一种方法是使用在C++中交换双倍数据位
double val, tmp = 5.55;
((unsigned int *)&val)[0] = ntohl(((unsigned int *)&tmp)[1]);
((unsigned int *)&val)[1] = ntohl(((unsigned int *)&tmp)[0]);
但后来我收到了警告:“提领类型punned指针将打破严格走样规则”,我不希望关闭此警告。
另一种方式去就是:
#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 2010-04-20 07:49:15
昨天我类似的问题,你可能会感兴趣的答案(http://stackoverflow.com/questions/2667225/endianness-conversion-and-g-warnings) – 2010-04-20 07:54:36
我查了你的问题的答案和解决方案OK,对我来说,谢谢 – hidayat 2010-04-20 08:23:33