【问题标题】:Hex to long double c++十六进制到长双 C++
【发布时间】:2013-08-09 18:01:33
【问题描述】:

是否有人知道如何在 c++ 中将 long double 转换为 hex 并从 hex 转换为 long double。我已经使用 istringstream 将 HEXstring 转换为 long long 并将其转换为 double,但不知道如何转换 long double 以及如何测试类似的东西。

【问题讨论】:

  • 你真的是指十进制而不是双精度吗?
  • 您是在问如何以十六进制和十进制打印数字吗?
  • 你的意思是像 C99 十六进制浮点表示,还是只是二进制数据的十六进制输出?

标签: c++ double type-conversion long-integer hex


【解决方案1】:

如果您真的确定要这样做,您最多可以使用联合来“欺骗类型系统”。显然,这是原始内存访问,并带有大量警告。最重要的是,它仅“通常”有效,但语言规范不保证。

输出长双精度的原始字节的代码如下。从十六进制字符串重新组装长双精度的代码应该不会太难自己提供。

#include <stdio.h>

typedef union {
  long double ld;
  char bytes[sizeof(long double)];
} converter; 

int main() {
  converter c;
  c.ld = 3.49;
  printf("0x");
  for (int i = 0; i < sizeof(long double); ++i) {
    printf("%x", c.bytes[i]);
  }
  printf("\n");
}

【讨论】:

  • 很确定这是未定义的行为。它可能会打印字节,也可能不会。您正在访问一个生命周期尚未开始的对象。 char 也可能已签名或未签名。
【解决方案2】:

很抱歉发布了尸体。无论如何,这是我的解决方案。 它应该适用于long double 是一种类型的任何平台。

除位域外,对象由一个或多个字节的连续序列组成,每个字节由 CHAR_BIT 位组成,可以用 memcpy 复制到 unsigned char[n] 类型的对象中,其中 n 是目的。结果数组的内容称为对象表示。

见:C Objects Strict Aliasing

// C11
#include <stdio.h>  // printf
#include <string.h> // memcpy, size_t, NULL
#include <assert.h> // assert macro

int main(void) {
  const long double src = 3.1415926L;
  unsigned char dest[sizeof src] = { 0 };
  assert (memcpy(dest, &src, sizeof src) != NULL);

  printf("%Lf in hex: 0x", src);
  for (size_t i = 0ul; i < sizeof src; ++i)
    printf("%X", dest[i]);
}

Live Example

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 2013-09-27
    • 2011-06-01
    • 1970-01-01
    • 2012-09-08
    • 2014-04-18
    • 2014-11-30
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多