有人知道如何在 c++ 中将 long double 转换为 hex 并从 hex 转换为 long double。我已经使用 istringstream 将 HEXstring 转换为 long long 并将其转换为 double,但不知道如何转换 long double 以及如何测试类似的东西。
问问题
973 次
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 回答