2016-10-03 5 views
-6

Я изучаю, как программы сохраняют данные в своей памяти. Так что я сделал простую программу, которая содержит глобальную двойную переменную:View Double Variable In Memory

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

using namespace std; 

double b = 512; 

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

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

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

1st Picture

Когда я преобразовать его в шестнадцатеричный он показывает:

2nd Picture

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

3rd Picture

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

Что такое 4080000000000000 во втором изображении и как оно равно 512?

+2

Полностью неясно, о чем вы спрашиваете. –

+3

двойные типы кодируются с использованием стандарта IEEE, а не целого. –

+1

Посмотрите: https://en.wikipedia.org/wiki/IEEE_754-1985 –

ответ

5

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) = 1032
  • показатель = 2^(1032 - 1023) = 2^9, где 1023 смещения экспоненту
1

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

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

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