-6

我正在研究程序如何将数据保存在内存中。所以我做了一个包含全局双变量的简单程序:

#include <iostream>
#include <conio.h>

using namespace std;

double b = 512;

int main(){
    getch();
    return 0;
}

当我想从任何读取内存的程序(在我的情况下为 CheatEngine)中搜索内存中的这个双变量时,我看到了一些不清楚的东西。

CheatEngine 在内存中找到 512 :

第一张图片

当我将其转换为十六进制时,它显示:

第二张图片

当我浏览这个变量在内存中的位置时,它就像:

第三张图片

所以我将 512 从十进制转换为十六进制,它是 200,但是第二张图片中没有类似的 200。

第二张图片中的 4080000000000000 是什么以及它如何等于 512 ?

4

2 回答 2

9

4080000000000000 是 +512.0 的双重表示。double 在内存中用符号、指数和尾数表示。

       4   0   8         0     00       00       00       00       00        00
 0    100 00001000     0000 00000000 00000000 0000000 000000000 00000000 00000000
 ^    ------------     ----------------------------------------------------------
 |        
sign  exponent = 2^9   mantissa with implicit high bit = 1 (normal)

所以表示的数字是 2^9 * 1.0 = 512.0。

笔记

  • (408) 16 = 1032
  • 指数 = 2^(1032 - 1023) = 2^9,其中 1023 是指数偏差
于 2016-10-03T21:14:03.503 回答
1

正如 Jean-Francoise 所指出的,整数和浮点数在内存中的表示是不同的。

数据类型是一个double64 位宽的浮点数,同时0x200是 512 的整数表示。

您还可以使用它GDB来检查程序的内存内容,前提是您允许将调试信息包含在程序中。

于 2016-10-03T21:14:50.850 回答