0

我需要解码编码为IEEE double(来自 iOS NSTimeInterval)的时间戳并存储在一个 8 字节数组中,以便我可以使用ctime以人类可读格式打印出时间戳。这在大多数系统上都是微不足道的,但在我的系统上却不是。

Example: on iOS side

uint8_t data[8];
double x = 3.14;
memcpy(data,&x,8);

我在 MSP430F5438A 上运行,我需要使用 COFF ABI 与第 3 部分库链接。如果您使用 COFF ABI,TI 的Code Composer 不支持 64 位浮点类型(IEEE double)。doublefloat(即单精度)相同。

这些都行不通。

uint8_t data[8];
double x; 
memcpy(&x,data,8);

或者

x = *(double*)data;

或者

union {
   uint8_t data[8];
   double d;
} x;
memcpy(x.data,data,8);

我只是胡言乱语,因为double使用 Code Composer 只有 4 个字节。我需要一种将uint8_t[8]数据(这是一个合法的 IEEE 双精度值)直接转换为整数值的方法。

4

1 回答 1

1

这会将积分转换double为精确uint32_t(只要没有溢出,最多 2^32-1)。如果 double 是 Nan 或 Inf,它将不起作用,但这不太可能。

static unsigned long ConvertDoubleToULong(void* d)
{
 unsigned long long x;
 unsigned long long sign ;
 long exponent;
 unsigned long long mantissa;

 memcpy(&x,d,8);

 // IEEE binary64 format (unsupported)
 sign     = (x >> 63) & 1; // 1 bit
 exponent = ((x >> 52) & 0x7FF); // 11 bits
 mantissa = (x >> 0) & 0x000FFFFFFFFFFFFFULL; // 52 bits
 exponent -= 1023;

 mantissa |=           0x0010000000000000ULL; // add implicit 1

 int rshift = 52 - exponent;
 if (rshift > 52) {
    x = 0;
 } else if (rshift >=0) {
    x = mantissa >> rshift;
 } else {
    x = 0x7FFFFFFF;
 }
 if (sign == 0) {
    return x;
 } else {
    return -x;
 }
}
于 2013-10-29T21:26:55.647 回答