c++ - 将十六进制转储转换为 double

标签 c++ c hex

我的程序当前通过从存储 double 值的内存中读取来打印十六进制转储。

它给了我

00 00 00 00 00 50 6D 40

我如何理解这一点并获得我存储的值,即 234.5?

我知道double有64位,第一位是符号位,接下来的11位是指数,最后52位是尾数

(-1)^sign * (1.mantissa) * 2^(指数 - 1023)

但是,我已经尝试了 double 的 little endian 和 big endian 表示,但我似乎无法让它工作。

最佳答案

首先要认识到的是,大多数现代处理器都使用小端表示法。这意味着最后一个字节实际上是最重要的。因此,作为单个十六进制常量的值是 0x406d500000000000

符号位是0。接下来的 11 位是 0x406。接下来的 52 个是 0xd500000000000

(-1)^sign12^(exponent - 1023)128。这些很简单。

1.mantissa 很难评估,除非您了解它的真正含义。它是常量 1.0 后跟作为分数的 52 位尾数。要将整数转换为分数,您需要将其除以 2^52 的表示形式。 0xd500000000000/(2**52)0.83203125

将它们放在一起:1 * (1.0 + 0.83203125) * 128234.5

关于c++ - 将十六进制转储转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23025737/

相关文章:

c - 链接两个目标文件以生成一个二进制文件

javascript - 跨浏览器以一致格式获取元素背景颜色的可靠方法?

php - 在 MySQL 中将 HEX 列转换为 DEC

c++ - 无法从 ffmpeg 示例运行 transcode.c

c - 如何在 C 中递增语句或递减语句?

c++ - QTableWidget 选中需要的行列信息

c - 查找缓冲区溢出的堆栈起点

jquery - 使用十六进制值和变量改变 jquery 中的 .css 渐变

c++ - 无法将元素添加到共享指针的线程安全锁定队列中

c++ - 在 C++ 中将矩阵相加