2010-04-07 112 views
3

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

我想要做的事很简单。我想声明Double类型的变量, Float,Decimal,并将值1.1分配给这些变量中的每一个。然后我想 去看看这些值如何表示在内存中。我需要获取变量的内存地址 以便了解它如何存储在内存中。一旦我有了 内存地址,我打算在代码中放置一个断点,并在Visual Studio中使用Debug - > Windows - > Memory 选项来查看数字如何存储在内存中。

干杯,

回答

7

是的,有可能获得一个原始指针存储在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

+0

感谢您花时间回答。 – user310616 2010-04-09 08:52:13

4

如果你只是想看到的事情是如何被记忆所代表然后使用BitConverter类,这将给你回一个字节数组。你可以在C#中获得变量的地址,但是可能是没有太大意义。

当然BitConverter不处理小数,所以你可以做的就是使用调试内存窗口,并在变量的作用域中使用语法&varname,它会为你找到地址。

+0

感谢您花时间回答。 – user310616 2010-04-09 08:53:20

1

同意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 

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

+1

感谢您花时间回答。 – user310616 2010-04-09 08:53:48