变量的内存地址

3

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

我要做的事情非常简单。我想声明Double、Float、Decimal类型的变量,并将值1.1分配给这些变量。然后,我想查看这些值在内存中的表示方式。为了查看它在内存中的存储方式,我需要获取变量的内存地址。一旦我有了内存地址,我计划在代码中设置断点,并使用Visual Studio中的“调试”->“窗口”->“内存”选项来查看数字在内存中的存储方式。

谢谢!

3个回答

7
是的,在C#中可以获得指向存储的原始指针。我建议您阅读 C# 规范的第18章,该章节详细讨论了这个主题,而不是在这里尝试解释它。
然而,如果您想学习各种不同浮点类型如何存储值,有比在调试器中查看它们更简单的方法。这些都是有充分文档记录的格式;您可以在维基百科或 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

float与double相同,只是大小减半:一个符号位,8个指数位,23个尾数位。详见http://en.wikipedia.org/wiki/Single_precision_floating-point_format


感谢您抽出时间回答。 - user310616

4
如果您只想查看内存中的内容表示方式,则可以使用BitConverter类,该类将返回一个字节数组。您可以在C#中获取变量的地址,但是这样做可能没有太大意义。
当然,BitConverter无法处理小数,所以您可以使用调试内存窗口,在变量的作用域中使用语法&varname,它会为您计算出地址。

感谢您抽出时间回答。 - user310616

1

同意tyranid的观点,它们在内部将以位表示,并获取它们的内存地址不会起到任何作用。另一方面,您可以使用ILdasm检查编译器为您在C#代码中指定的值生成的实际类型。考虑以下在C#中的声明:

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

如果您通过ILDasm检查IL代码,那么这就是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

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


1
感谢您抽出时间回答。 - user310616

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接