Я изучаю, как программы сохраняют данные в своей памяти.
Поэтому я сделал простую программу, которая содержит глобальную двойную переменную:
#include <iostream>
#include <conio.h>
using namespace std;
double b = 512;
int main(){
getch();
return 0;
}
Когда я хочу найти эту двойную переменную в памяти из любых программ, которые читают память (в моем случае CheatEngine), я вижу что-то неясное.
CheatEngine Находит 512 в памяти:
Когда я конвертирую его в шестнадцатеричный формат, он показывает:
И когда я просматриваю расположение этой переменной в памяти, это похоже на:
Поэтому я конвертирую 512 из десятичного в шестнадцатеричное, и это 200, но нет ничего похожего на 200 на втором рисунке.
Что такое 4080000000000000 на втором рисунке и как оно равно 512?
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.
Заметка
Как отметил Жан-Франсуаза, Integer и плавающая запятая Числовое представление в памяти различно.
double
тип данных — это число с плавающей точкой шириной 64 бита, между тем 0x200
является целочисленным представлением 512.
Вы также можете использовать GDB
для проверки содержимого памяти вашей программы, при условии, что вы включаете отладочную информацию для включения в вашу программу.