.net NET十进制的二进制表示形式

.net NET十进制的二进制表示形式,.net,binary,decimal,representation,.net,Binary,Decimal,Representation,如何在内存中以二进制形式表示.NETdecimal类型 我们都知道浮点数是如何存储的,因此也知道浮点数不准确的原因,但除了以下信息外,我找不到任何关于十进制数的信息: 显然比浮点数更精确 占用128位内存 2^96+符号范围 28(有时为29?)数字中的总有效位数 有什么办法让我弄明白吗?我内心的计算机科学家需要答案,经过一个小时的尝试研究,我找不到答案。看起来要么是浪费了很多,要么就是我脑子里想的不对。有人能解释一下吗?获取您想要的信息 基本上,它是一个96位的整数作为尾数,加上一个符号位,再

如何在内存中以二进制形式表示.NET
decimal
类型

我们都知道浮点数是如何存储的,因此也知道浮点数不准确的原因,但除了以下信息外,我找不到任何关于
十进制数的信息:

  • 显然比浮点数更精确
  • 占用128位内存
  • 2^96+符号范围
  • 28(有时为29?)数字中的总有效位数
  • 有什么办法让我弄明白吗?我内心的计算机科学家需要答案,经过一个小时的尝试研究,我找不到答案。看起来要么是浪费了很多,要么就是我脑子里想的不对。有人能解释一下吗?

    获取您想要的信息

    基本上,它是一个96位的整数作为尾数,加上一个符号位,再加上一个指数,表示要向右移动小数位数

    因此,要表示3.261,尾数为3261,符号位为0(即正),指数为3。请注意,十进制不是标准化的(有意),因此您也可以使用尾数32610和指数4来表示3.2610,例如

    我在关于的文章中有更多的信息。

    十进制是如何存储的? 十进制数以128位存储,尽管严格来说只需要102位。将十进制看作是表示尾数的三个32位整数,然后表示符号和指数的一个整数是很方便的。最后一个整数的高位是符号位(按正常方式,该位被设置为负数的(1)),位16-23(高16位字的低位)包含指数。其他位必须全部清除(0)。此表示形式由
    decimal.GetBits(decimal)
    给出,它返回一个4个整数的数组


    +1个精彩的答案,切中要害,信息丰富。@Jacob:不,那显然不是真的。假设你可以从一个整数开始,然后以(比如)0.1结束,这显然是右移。如果你只能向左移动,你可以表示10100等,但不能表示0.1、0.01等。在将来,请等待“确认”,然后再像这样显著地更改答案的含义。请参阅
    decimal
    :-其中比例因子被称为整数的除法,这相当于将其向右移动。我很抱歉。对我来说,将小数点向左移动更直观,但我现在看到你指的是“移动”尾数。从书中:«位16-23(高16位单词的低位)包含指数»–这是否意味着指数有8位,因此可以最多向右移动255位小数?@nalply:8位实际上是为指数保留的,但它有一个限制,因此范围实际上仅为0-29。