为什么 C# System.Decimal(十进制)“浪费”位?

Tom*_*Tom 11 c# decimal internals cpu-architecture data-structures

正如官方文档中所写,128 位的System.Decimal填充如下:

返回值是一个由 32 位有符号整数组成的四元素数组。

返回数组的第一个、第二个和第三个元素包含 96 位整数的低、中和高 32 位。

返回数组的第四个元素包含比例因子和符号。它由以下部分组成:

位 0 到 15,即较低的字,未使用且必须为零。

位 16 到 23 必须包含一个介于 0 到 28 之间的指数,表示 10 的幂除以整数。

位 24 到 30 未使用且必须为零。

第 31 位包含符号:0 表示正,1 表示负。

考虑到这一点,人们可以看到有些位被“浪费”或未使用。

为什么不是例如 120 位整数、7 位指数和 1 位符号。

十进制可能有一个很好的理由。这个问题想知道这个决定背后的原因。

Tom*_*Tom 3

基于凯文·戈斯的评论

就其价值而言,十进制类型似乎早于 .net。.net 框架 CLR 将计算委托给 oleaut32 库,我可以找到早在 Windows 95 上的 DECIMAL 类型的踪迹

我进一步搜索并发现了 oleauth32 Windows 95 中 DECIMAL 代码的可能用户。

旧的 Visual Basic(非基于 .NET)和 VBA 有一种称为“Variant”的动态类型。在那里(并且仅在那里)您可以保存与我们当前的System.Decimal.

Variant 始终为 128 位,前 16 位保留用于Variant 内数据类型的枚举值。

剩余 112 位的分离可以基于 90 年代早期的常见 CPU 架构或 Windows 程序员的易用性。不将指数和符号打包到一个字节中,只是为了让整数多一个可用字节,这听起来是明智的。

当构建 .NET 时,该类型的现有(低级)代码及其操作被重用于System.Decimal.

这些都不是 100% 验证的,我希望答案包含更多历史证据,但这就是我可以一起困惑的。