【发布时间】:2010-04-20 07:42:34
【问题描述】:
我正在尝试将双精度从大端更改为小端。一种方法是使用
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 风格的强制转换。
-
我昨天遇到了类似的问题,你可能对答案感兴趣(stackoverflow.com/questions/2667225/…)
-
我检查了你的问题的答案,我的解决方案没问题,谢谢
标签: c++ floating-point double bits endianness