有人知道如何在c ++中将long double转换为hex并从hex转换为long double。我已经做了一些从HEXstring到double的转换,使用istringstream来加长long并将其转换为double,但无法计算如何转换long double,以及如何测试类似的东西。
答案 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 是目的。结果数组的内容称为对象表示。
// 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]);
}