我正在研究程序如何在内存中保存数据。 所以我创建了一个包含全局双变量的简单程序:
#include <iostream>
#include <conio.h>
using namespace std;
double b = 512;
int main(){
getch();
return 0;
}
当我想从任何读取内存的程序(在我的案例中为CheatEngine)中搜索内存中的这个双变量时,我看到一些不清楚的东西。
CheatEngine在内存中找到512:
当我将其转换为十六进制时,它会显示:
当我在内存中浏览此变量的位置时,它就像:
所以我将512从十进制转换为十六进制,它是200,但在第二张图片中没有类似的200。
第二张图片中的4080000000000000是多少以及它是如何等于512的?
答案 0 :(得分:7)
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。
注意
答案 1 :(得分:1)
正如Jean-Francoise指出的那样,记忆中的整数和floating point数字表示是不同的。
double
数据类型是64位宽的浮点数,同时0x200
是512的整数表示。
您还可以使用GDB
检查程序的内存内容,同时启用调试信息以包含在程序中。