2010-04-07 6 views
3

Est-il possible d'obtenir l'adresse mémoire d'une variable en C#. Ce que j'essaie de faire est très simple. Je veux déclarer des variables de type Double, Float, Decimal et affecter la valeur 1.1 à chacune de ces variables. Ensuite, je voudrais aller voir comment ces valeurs sont représentées en mémoire. Je dois obtenir l'adresse mémoire de la variable afin de voir comment il est stocké dans la mémoire. Une fois que j'ai l'adresse mémoire , je prévois de mettre un point d'arrêt dans le code et d'utiliser l'option Debug -> Windows -> Memory dans visual studio pour voir comment les nombres sont stockés en mémoire.Adresse mémoire d'une variable

Cheers,

Répondre

7

Oui, il est possible d'obtenir un pointeur brut pour le stockage en C#. Plutôt que d'essayer de tout expliquer ici, je vous recommande de lire tout le chapitre 18 de la spécification C#, qui traite de ce sujet en détail.

Cependant, si ce que vous voulez faire est d'apprendre comment divers types de virgules flottantes stockent des valeurs, il existe des moyens plus faciles que de les regarder dans un débogueur. Ce sont tous des formats bien documentés; vous pouvez juste les regarder dans wikipedia ou msdn et lire sur la façon dont ils sont disposés dans la mémoire. La représentation binaire d'une valeur décimale se compose d'un signe de 1 bit, d'un nombre entier de 96 bits et d'un facteur d'échelle utilisé pour diviser l'entier de 96 bits et spécifier quelle partie est une fraction décimale. Le facteur d'échelle est implicitement le nombre 10, élevé à un exposant allant de 0 à 28.

Voir http://msdn.microsoft.com/en-us/library/system.decimal.aspx pour plus de détails.

La représentation binaire d'un double est un bit de signe, 11 bits d'exposant représentant un exposant de -1022 à +1023, et 52 bits de mantisse, qui sont interprétés "1". suivi par les 52 bits.

Voir http://en.wikipedia.org/wiki/Double_precision ou ma série d'articles sur les questions à virgule flottante: http://blogs.msdn.com/ericlippert/archive/tags/Floating+Point+Arithmetic/default.aspx

Un flotteur est identique à un double, à la moitié de la taille: un bit de signe, 8 bits d'exposant, 23 bits de mantisse.Voir http://en.wikipedia.org/wiki/Single_precision_floating-point_format pour plus de détails.

+0

Merci d'avoir pris le temps de répondre. – user310616

4

Si vous voulez juste voir comment les choses sont représentées dans un mémoire, puis utiliser la classe BitConverter qui vous redonneront un tableau d'octets. Vous pouvez obtenir l'adresse des variables en C# mais il probablement n'est pas beaucoup de point.

Bien sûr, BitConverter ne gère pas les décimales, vous pouvez donc utiliser la fenêtre de débogage et dans la portée de la variable, utilisez simplement la syntaxe &varname et l'adresse sera calculée pour vous.

+0

Merci d'avoir pris le temps de répondre. – user310616

1

D'accord avec tyranid, elles seront représentées en interne et leur adresse mémoire ne servira à rien. D'autre part, vous pouvez utiliser ildasm pour inspecter le type réel généré par le compilateur pour les valeurs que vous spécifiez dans votre C# code.Consider suivante decleration en C#: -

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

Si vous inspectez le code IL par ildasm, puis c'est ce qui est généré par le compilateur C# pour le decleration ci-dessus: -

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

ici vous pouvez voir que décimal est représenté en interne comme nombre hexadécimal.

+1

Merci d'avoir pris le temps de répondre. – user310616

Questions connexes