【问题标题】:Delphi Double to Objective C doubleDelphi Double 到 Objective C double
【发布时间】:2014-08-15 12:37:08
【问题描述】:

我正在寻找几个小时来解决这个问题,但我不明白它是如何工作的。我有一个来自 delphi 双值的十六进制字符串:0X3FF0000000000000。该值应为 1.0。它有 8 个字节长,第一位是符号,接下来的 11 位是指数,其余的是尾数。所以对我来说,这个十六进制值等于 0 x 10^(1023)。也许我在某个地方错了,但这没关系。关键是,我需要将这个十六进制值转换为目标 c 双精度值。如果我这样做:(double)strtoll(hexString.UTF8String, NULL,16); 我得到:4.607...x 10 ^18。我究竟做错了什么?

【问题讨论】:

  • 严格来说,这不是 delphi double,而是标准的 IEEE-754 double。指数以 1023 的偏移量编码,使您的值 10^(0) = 1.0。你是怎么得到一个十六进制字符串的?对于目的而言,这似乎不是一种明智的格式...
  • 在 IEEE 64 位二进制中为 1.0。详情请参阅 (en.wikipedia.org/wiki/Double_precision_floating-point_format)。

标签: objective-c delphi double


【解决方案1】:

似乎尝试以这种方式进行转换最终会调用隐式类型转换(调用_ultod3_ltod3)来改变基础数据。事实上,即使尝试这样做似乎也做了同样的事情:

UINT64 temp1 = strtoull(hexString, NULL, 16);
double val = *&temp1;

但是,如果您将 uint 指针转换为 double*,它似乎会抑制编译器尝试执行转换的愿望。这样的事情应该可以工作:

UINT64 temp1 = strtoull(hexString, NULL, 16);
double val = *(double*)&temp1;

至少这适用于 MS C++ 编译器...我想目标 C 编译器也会配合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2011-06-21
    • 2014-05-17
    相关资源
    最近更新 更多