【发布时间】:2017-10-10 14:03:13
【问题描述】:
我什至不确定我的标题是否准确,但对于我的项目,我需要取一个双精度并将其转换为十六进制,然后再将其转换回双精度。但为了做到这一点,我认为我需要重载运算符 有人可以指出我应该如何重载
#include <iostream>
#include <iomanip>
#include <cstdint>
using namespace std;
void out_char_as_hex(int c)
{
cout << hex << setw(2) << setfill('0') << c;
}
int main()
{
union { double d; uint64_t u; } tmp;
double x = -0.15625;
tmp.d = x;
cout << out_char_as_hex(tmp.d) << endl;
return 0;
}
如果有帮助,这是一个问题“如果 x 是 double 类型的变量,它的二进制表示可以重新解释为 64 位整数,可以精确表示。为此,您可以获取内存地址到 double 类型的变量并重新解释将其转换为 64 位 int 指针或使用联合。为了使文本表示更紧凑,我们使用基数 16(十六进制)。例如,应保存双精度数 -0.15625归档为 16 个字符的序列 bfc4000000000000(参见 DemoHex.cpp 中的示例, 使用联合)。读取时需要读取整数 以十六进制格式保存并将其重新解释为双精度。 您需要修改 operator>"
【问题讨论】:
-
你“不能”使用联合。在 C++ 中通过联合进行类型双关是非法的。
-
也许我遗漏了一些东西,但这个问题对我来说没有意义。浮点值没有十六进制表示。你能写一些预期的输入/输出吗?
-
如果您放弃“使用联合”要求,则可以通过使用
memcpy使其在没有未定义行为的情况下工作。 -
我不认为这是基本的 C++,尽管在 C 时代,人们希望尽快使用这些技巧。 Primitives/std::string/iostream/main、loop/branch、class/function、containers (std::vector)、头文件/源文件。迭代器/算法/lambdas,继承/多态,其次是基本模板,转换和字节表示真正属于之后。
-
看来你的教授对 C++ 的了解还不够,无法教授它。不幸的是,这也不例外,这是常态。如果你真的想学习 C++,请带着很大的怀疑态度和read a book 来学习你在那里学到的一切。