是否可以在C#中獲取變量的內存地址。變量的內存地址
我想要做的事很簡單。我想聲明Double類型的變量, Float,Decimal,並將值1.1分配給這些變量中的每一個。然後我想 去看看這些值如何表示在內存中。我需要獲取變量的內存地址 以便了解它如何存儲在內存中。一旦我有了 內存地址,我打算在代碼中放置一個斷點,並在Visual Studio中使用Debug - > Windows - > Memory 選項來查看數字如何存儲在內存中。
乾杯,
是否可以在C#中獲取變量的內存地址。變量的內存地址
我想要做的事很簡單。我想聲明Double類型的變量, Float,Decimal,並將值1.1分配給這些變量中的每一個。然後我想 去看看這些值如何表示在內存中。我需要獲取變量的內存地址 以便了解它如何存儲在內存中。一旦我有了 內存地址,我打算在代碼中放置一個斷點,並在Visual Studio中使用Debug - > Windows - > Memory 選項來查看數字如何存儲在內存中。
乾杯,
是的,有可能獲得一個原始指針存儲在C#中。我建議您閱讀C#規範的第18章,詳細討論這個主題,而不是試圖在這裏解釋它。然而,如果你想要做的是學習各種不同的浮點類型如何存儲值,有比在調試器中查看它們更簡單的方法。這些都是有據可查的格式;你可以在維基百科或MSDN中查看它們,並閱讀它們在內存中的佈局。
Decimal值的二進制表示形式由一個1位符號,一個96位整數和一個縮放因子組成,用於分割96位整數並指定它的哪一部分是小數部分。縮放因子隱含地是數字10,被提升至從0到28的指數。
有關詳細信息,請參閱http://msdn.microsoft.com/en-us/library/system.decimal.aspx。
雙精度的二進制表示是一個符號位,表示從-1022到+1023的指數的11個指數位,以及解釋爲「1」的52位尾數。接着是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。
如果你只是想看到的事情是如何被記憶所代表然後使用BitConverter類,這將給你回一個字節數組。你可以在C#中獲得變量的地址,但是可能是沒有太大意義。
當然BitConverter不處理小數,所以你可以做的就是使用調試內存窗口,並在變量的作用域中使用語法&varname
,它會爲你找到地址。
感謝您花時間回答。 – user310616 2010-04-09 08:53:20
同意tyranid,他們在內部他們將被重新表示,並且讓他們的內存地址不起任何作用。在另一方面,你可以使用ILDASM檢查你在C#code.Consider指定以下用C#decleration由編譯器的值產生的實際類型: -
double d1 = 21.1;
decimal d2 = 22.1M;
float d3 = 21.1F;
如果通過ILDASM檢查IL代碼,然後這是由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
在這裏你可以看到,小數內部表示爲十六進制數。
感謝您花時間回答。 – user310616 2010-04-09 08:53:48
感謝您花時間回答。 – user310616 2010-04-09 08:52:13