在幕后,C#/ .NET中的十进制值类型发生了什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

这个decimal类型是如何实现的?

  • 这是一个128位值类型(16字节)
  • 1个符号位
  • 尾数为96位(12字节)
  • 指数的8位
  • 其余的位(其中23个!)设置为0

我会坚持用我自己的隐含比例来使用64位长。

提问于
用户回答回答于

维基百科上的十进制浮点数文章,与本文有关的特定链接System.Decimal

小数点存储在128位中,即使只有102位是严格必要的。将小数看作代表尾数的三个32位整数以及表示符号和指数的一个整数是很方便的。最后一个整数的最高位是符号位(正常情况下,该位置1(负数)),16-23位(低16位字的低位)包含指数。其他位必须全部清零(0)。这种表示法是由decimal.GetBits(十进制)给出的,它返回一个4个整数的数组。

用户回答回答于

http://msdn.microsoft.com/en-us/library/system.decimal(VS.80).aspx上MSDN的Decimal Structure页面所述:

Decimal值的二进制表示由1位符号,96位整数和用于分割96位整数的比例因子组成,并指定它的哪一部分是小数部分。缩放因子隐含地是数字10,被提升到范围从0到28的指数。因此,十进制值的二进制表示形式为((-296到296)/ 10(0到28)),其中-296-1等于MinValue,而296-1等于MaxValue。 比例因子还保留了一个十进制数中的任何尾随零。尾数零不会影响算术或比较操作中的十进制数值。但是,如果应用了适当的格式字符串,则ToString方法可以显示尾随零。

扫码关注云+社区