十六进制到长双c ++

时间:2013-08-08 06:07:20

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

有人知道如何在c ++中将long double转换为hex并从hex转换为long double。我已经做了一些从HEXstring到double的转换,使用istringstream来加长long并将其转换为double,但无法计算如何转换long double,以及如何测试类似的东西。

2 个答案:

答案 0 :(得分:2)

如果你确实想要这样做,你最多使用一个联盟来“欺骗类型系统”。显然,这是原始内存访问,并伴随着大量的警告。其中最重要的是它只是“通常”有效,但不受语言规范的保证。

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

#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");
}

答案 1 :(得分:0)

很抱歉发布尸检。无论如何,这是我的解决方案。 它应该适用于 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