2010-04-07 5 views
3

Возможно ли получить адрес памяти переменной в C#.Адрес памяти переменной

То, что я пытаюсь сделать, очень просто. Я хочу объявить переменные типа Double, Float, Decimal и присвоить значение 1.1 каждой из этих переменных. Затем я хотел бы пойти и посмотреть, как эти значения представлены в памяти. Мне нужно получить адрес памяти переменной , чтобы узнать, как она хранится в памяти. Как только у меня есть адрес памяти , я планирую поставить точку останова в коде и использовать опцию Debug -> Windows -> Memory в визуальной студии, чтобы увидеть, как номера хранятся в памяти.

Приветствия,

ответ

7

Да, в C# можно получить необработанный указатель на хранение. Вместо того, чтобы пытаться объяснить все это здесь, я рекомендую вам прочитать всю главу 18 спецификации C#, в которой подробно обсуждается этот вопрос.

Однако, если вы хотите, чтобы узнать, как различные типы с плавающей точкой хранят значения, есть более простые способы, чем смотреть на них в отладчике. Все это хорошо документированные форматы; вы можете просто посмотреть их в wikipedia или msdn и прочитать о том, как они выложены в памяти.

Бинарное представление десятичного значения состоит из 1-битового знака, 96-битного целочисленного числа и коэффициента масштабирования, используемого для деления 96-битного целого числа, и указать, какая часть его является десятичной дробью. Масштабный коэффициент неявно равен числу 10, поднятому до показателя в диапазоне от 0 до 28.

Подробнее см. http://msdn.microsoft.com/en-us/library/system.decimal.aspx.

Бинарное представление двойника - это один знаковый бит, 11 значащих битов, представляющих экспоненту от -1022 до +1023 и 52 бит мантиссы, которые интерпретируются «1». а затем 52 бит.

См http://en.wikipedia.org/wiki/Double_precision или мою серию статей по вопросам с плавающей точкой: http://blogs.msdn.com/ericlippert/archive/tags/Floating+Point+Arithmetic/default.aspx

Поплавок является такой же, как двойной, только половина размера: один знаковый бит, 8 бит экспоненты, 23 мантиссы бит.См. http://en.wikipedia.org/wiki/Single_precision_floating-point_format.

+0

Спасибо, что нашли время ответить. – user310616

4

Если вы просто хотите посмотреть, как получить представлены в памяти, то используйте BitConverter класс, который даст вам обратно массив байтов. Вы можете получить адрес переменных в C#, но там , вероятно, не так много.

Конечно, BitConverter не обрабатывает десятичные знаки, поэтому то, что вы можете сделать, это использовать окно отладочной памяти, а в области переменной просто использовать синтаксис &varname, и он выработает адрес для вас.

+0

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

1

Согласитесь с tyranid, thet внутренне они будут представлены в битах, и получение их адреса памяти не будет служить никакой цели. С другой стороны, вы можете использовать ILDASM, чтобы проверить фактический тип генерируемого компилятором для значений, указанных вами в C# code.Consider следующий decleration в C#: -

double d1 = 21.1; 
decimal d2 = 22.1M; 
float d3 = 21.1F; 

Если вы проверяете код IL через ILDASM, затем это то, что порождается C# компилятор для вышеприведенного decleration: -

//000012:    double d1 = 21.1; 
    IL_0001: ldc.r8  21.100000000000001 
.............. 
//000013:    decimal d2 = 22.1M; 
    IL_000b: ldc.i4  0xdd 
............... 
//000014:    float d3 = 21.1F; 
    IL_001a: ldc.r4  21.1 

здесь вы можете увидеть, что десятичное внутренне представлен в виде числа Hex.

+1

Спасибо, что нашли время ответить. – user310616

Смежные вопросы