Адрес памяти переменной - PullRequest
3 голосов
/ 07 апреля 2010

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

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

Приветствия

Ответы [ 3 ]

7 голосов
/ 07 апреля 2010

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

Однако, если вы хотите узнать, как различные различные плавающиеТипы точек хранят значения, есть более простые способы, чем смотреть на них в отладчике.Это все хорошо документированные форматы;Вы можете просто посмотреть их в Википедии или 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

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

4 голосов
/ 07 апреля 2010

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

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

1 голос
/ 07 апреля 2010

Согласитесь с тиранидом, поэтому внутри они будут представлены в битах, и получение их адреса памяти не будет служить какой-либо цели. С другой стороны, вы можете использовать ILdasm для проверки фактического типа, сгенерированного компилятором, для значений, которые вы указываете в своем коде C #. Рассмотрите следующее объявление в C #: -

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

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

//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

Здесь вы можете видеть, что десятичное число внутренне представлено как шестнадцатеричное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...