.NET Decimal的二进制表示

20

.NET decimal类型在内存中以二进制形式表示是怎样的呢?

我们都知道浮点数是如何存储的,因此不准确,但我无法找到关于decimal的任何信息,除了以下内容:

  1. 明显比浮点数更精确
  2. 占用128位内存
  3. 2^96 + 符号范围
  4. 数字中总共有28(有时29个)有效位数

我有什么办法可以弄清楚这个问题吗?作为一名计算机科学家,我需要这个答案。经过一个小时的尝试研究后,我找不到它。看起来要么有很多浪费的位,要么是我在脑海中的想象错误。请问有谁能为此解惑吗?

2个回答

40

Decimal.GetBits 可提供所需信息。

基本上,它是一个96位的整数作为尾数,加上一个符号位,再加上一个表示向右移动多少个十进制位数的指数。

因此,要表示3.261,您需要一个尾数为3261,符号位为0(即正数),指数为3。请注意,十进制数没有规范化(故意的),因此您还可以使用尾数为32610和指数为4来表示3.2610,例如。

我在我的小数浮点型文章中有更多信息。


1
+1个棒极了的答案,直戳要点且信息丰富。 - JoshD
@nalply:8位有效地保留给指数,但是它有一个限制,因此范围实际上只有0-29。 - Jon Skeet
这个回答比链接的文章清晰得多。即使文章给出了确切的公式,例子对于理解总是很有帮助的。 - Felix Dombek
所以,尾数有96位,符号有1位。我期望指数为0-28的5位,还有26个未使用的位,总共128位。但是根据MSDN页面,实际上只有23个未使用的位,因为指数用8位表示,而不是需要的5位。我猜测指数的最高3位也未使用,并且必须为零?或者如果它们不是零,它们会被忽略吗? - Adam Goodwin
@AdamGoodwin:我不想猜测如果它们不是零会发生什么,尽管构造函数的文档指出,如果比例超过28,则会抛出异常。 - Jon Skeet
显示剩余3条评论

1

https://www.csharpindepth.com/Articles/Decimal

如何存储十进制数?

一个十进制数存储在128位中,尽管只有102位是必要的。方便起见,将十进制数视为三个32位整数表示尾数,然后用一个整数表示符号和指数。最后一个整数的最高位是符号位(按照正常方式,对于负数,该位被设置为1),16-23位(高16位字的低位)包含指数。其他位必须全部清零(0)。这种表示方法是由decimal.GetBits(decimal)给出的,它返回一个由4个整数组成的数组。


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