变量的内存地址

时间:2010-04-07 04:34:26

标签: c# memory variables

是否可以在C#中获取变量的内存地址。

我想做的事情非常简单。我想声明Double类型的变量, Float,Decimal并为每个变量赋值1.1。然后我想 去看看这些值是如何在内存中表示的。我需要记忆 变量的地址,以便查看它如何存储在内存中。一旦我有了 内存地址我打算在代码中加一个断点并使用Debug - > Windows - >记忆 visual studio中的选项,以查看数字如何存储在内存中。

干杯,

3 个答案:

答案 0 :(得分:7)

是的,可以在C#中获取存储的原始指针。我建议你阅读C#规范的第18章,而不是试图在这里解释所有内容,它详细讨论了这个主题。

但是,如果您要做的是了解各种不同的浮点类型如何存储值,那么比在调试器中查看它们更容易。这些都是记录良好的格式;您可以在维基百科或msdn中查找它们,并阅读它们如何在内存中布局。

十进制值的二进制表示由1位符号,96位整数和用于除以96位整数的比例因子组成,并指定它的小数部分。缩放因子隐含地为数字10,上升到指数范围从0到28.

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.decimal.aspx

double的二进制表示是一个符号位,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

答案 1 :(得分:4)

如果您只想查看内存中的内容,请使用BitConverter类,它将返回一个字节数组。您可以在C#中获取变量的地址,但可能并不重要。

当然BitConverter不处理小数,所以你可以做的是使用调试内存窗口,在变量的范围内只需使用语法&varname,它将为你计算出地址。

答案 2 :(得分:1)

同意tyranid,在内部他们将被重复,并且他们的记忆地址不会用于任何目的。另一方面,您可以使用ILdasm检查编译器为您在C#代码中指定的值生成的实际类型.Cons在C#中进行解除后: -

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

在这里你可以看到小数在内部表示为十六进制数。