Просмотр двойной переменной в памяти

Я изучаю, как программы сохраняют данные в своей памяти.
Поэтому я сделал простую программу, которая содержит глобальную двойную переменную:

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

using namespace std;

double b = 512;

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

Когда я хочу найти эту двойную переменную в памяти из любых программ, которые читают память (в моем случае CheatEngine), я вижу что-то неясное.

CheatEngine Находит 512 в памяти:

1-е изображение

Когда я конвертирую его в шестнадцатеричный формат, он показывает:

2-е изображение

И когда я просматриваю расположение этой переменной в памяти, это похоже на:

3-е изображение

Поэтому я конвертирую 512 из десятичного в шестнадцатеричное, и это 200, но нет ничего похожего на 200 на втором рисунке.

Что такое 4080000000000000 на втором рисунке и как оно равно 512?

-6

Решение

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 — смещение показателя
7

Другие решения

Как отметил Жан-Франсуаза, Integer и плавающая запятая Числовое представление в памяти различно.

double тип данных — это число с плавающей точкой шириной 64 бита, между тем 0x200 является целочисленным представлением 512.

Вы также можете использовать GDB для проверки содержимого памяти вашей программы, при условии, что вы включаете отладочную информацию для включения в вашу программу.

1