1

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

4

2 回答 2

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");
}
于 2013-08-08T07:15:12.237 回答
0

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

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

请参阅:C 对象严格别名

// 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]);
}

现场示例

于 2021-07-03T20:00:49.373 回答