2010-09-27 25 views
15

Salut à tous, question rapide: Comment un type .NET decimal est représenté en binaire en mémoire?Représentation binaire d'un .NET Decimal

Nous savons tous comment les nombres à virgule flottante sont stockés et les Thusly les raisons de l'inexactitude de celle-ci, mais je ne peux trouver aucune information sur decimal sauf les suivants:

  1. Apparemment, plus précis que flottante des nombres à virgule
  2. Prend 128 bits de mémoire
  3. 2^96 + signe gamme
  4. 28 (parfois 29?) le total des chiffres significatifs dans le nombre

Y a-t-il un moyen de le comprendre? L'informaticien en moi demande la réponse et après une heure de recherche, je ne la trouve pas. On dirait qu'il y a beaucoup de bits gaspillés ou que je ne me fais pas d'illusions dans ma tête. Quelqu'un peut-il nous éclairer? Merci.

Répondre

30

Decimal.GetBits pour l'information que vous voulez.

Fondamentalement, il s'agit d'un entier de 96 bits comme la mantisse, plus un bit de signe, plus un exposant pour dire combien de décimales endroits pour le déplacer vers la droite.

Donc, pour représenter 3,261 vous auriez une mantisse de 3261, un bit de signe de 0 (positif), et un exposant de 3. Notez que la décimale est pas normalisée (délibérément) afin que vous puissiez aussi représenter 3.2610 en utilisant une mantisse de 32610 et un exposant de 4, par exemple.

J'ai plus d'informations dans mon article sur decimal floating point.

+0

+1 réponse fantastique, droit au but et riche en informations. – JoshD

+0

@Jacob: Non, c'est * clairement * pas vrai. Étant donné que vous pouvez commencer avec un nombre entier et finir avec (disons) 0,1, cela change évidemment bien. Si vous pouviez * seulement * décaler vers la gauche, vous seriez en mesure de représenter 10, 100 etc - mais pas 0,1, 0,01 etc. Dans l'avenir, veuillez attendre un "ack" avant de changer significativement la signification d'une réponse. Voir la documentation pour 'decimal': http://msdn.microsoft.com/en-us/library/1k2e8atx.aspx - où le facteur d'échelle est décrit comme * divisant * l'entier, ce qui équivaut à le déplacer vers le droite. –

+0

Mes excuses. Pour moi, il est plus intuitif de penser à déplacer le * point décimal * vers le * gauche *, mais je vois maintenant que vous parlez de "déplacer" la mantisse. – Jacob