我正在寻找几个小时来解决此问题,但我不知道它是如何工作的。我有一个来自delphi double值的十六进制字符串:0X3FF0000000000000。该值应为1.0。它是8字节长,第一位是符号,接下来的11位是指数,其余为尾数。所以对我来说,这个十六进制值等于0 x 10 ^(1023)。也许我在某个地方错了,但这没关系。关键是,我需要将此十六进制值转换为目标c double值。如果我这样做:(double)strtoll(hexString.UTF8String, NULL,16);
我得到:4.607 ... x 10 ^ 18。我究竟做错了什么?
似乎尝试以这种方式进行转换最终会导致对隐式类型转换(_ultod3
或_ltod3
)的调用,该隐式类型转换会更改基础数据。实际上,即使尝试执行此操作似乎也会执行相同的操作:
UINT64 temp1 = strtoull(hexString, NULL, 16);
double val = *&temp1;
但是,如果将uint指针double*
强制转换为a,则会抑制编译器尝试执行转换的愿望。这样的事情应该工作:
UINT64 temp1 = strtoull(hexString, NULL, 16);
double val = *(double*)&temp1;
至少这可以与MS C ++编译器一起使用...我想目标C编译器也可以配合使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句