簡體   English   中英

為什么 C# System.Decimal(十進制)“浪費”位?

[英]Why does C# System.Decimal (decimal) "waste" bits?

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

返回值是一個 32 位有符號整數的四元素數組。

返回數組的第一個、第二個和第三個元素包含 96 位 integer 數的低、中和高 32 位。

返回數組的第四個元素包含比例因子和符號。 它由以下部分組成:

位 0 到 15(低位字)未使用且必須為零。

位 16 到 23 必須包含 0 到 28 之間的指數,表示 10 的冪除以 integer 數。

位 24 到 30 未使用,必須為零。

第 31 位包含符號:0 表示正,1 表示負。

考慮到這一點,可以看到一些位“浪費”或未使用。

為什么不例如 120 位 integer、7 位指數和 1 位符號。

可能有一個很好的理由讓小數變成這樣。 這個問題想知道這個決定背后的原因。

基於凱文·戈斯的評論

就其價值而言,十進制類型似乎早於 .net。 .net 框架 CLR 將計算委托給 oleaut32 庫,我可以找到 DECIMAL 類型的蹤跡,最早可以追溯到 Windows 95

我進一步搜索並在 oleauth32 Windows 95 中找到了 DECIMAL 代碼的可能用戶。

舊的 Visual Basic(非基於 .NET)和 VBA 有一種稱為“變體”的動態類型。 在那里(並且只有在那里)你可以保存與我們當前的System.Decimal幾乎相同的東西。

Variant 始終為 128 位,前 16 位為枚舉值保留,該枚舉值的數據類型位於 Variant 內部。

剩余 112 位的分離可以基於 90 年代早期的常見 CPU 架構或 Windows 編程器的易用性。 聽起來不打包指數並簽入一個字節只是為了讓 integer 多一個字節可用。

當 .NET 構建此類型的現有(低級)代碼時,它的操作被重用於System.Decimal

這一切都沒有得到 100% 的驗證,我希望答案包含更多的歷史證據,但這就是我可以一起困惑的問題。

這是Decimal 的 C# 源 請注意FCallAddSub樣式方法。 這些調用(不可用)這些方法的快速 C++ 實現。

我懷疑實現是這樣的,因為這意味着對前 96 位“數字”的操作可以簡單而快速,因為 CPU 對 32 位字進行操作。 如果使用 120 位,CPU 操作會更慢且更棘手,並且需要大量位掩碼才能獲得有趣的額外 24 位,這將很難使用。 此外,這會“污染”最高的 32 位標志,並使某些優化變得不可能。

如果您查看代碼,您會發現這種簡單的位布局在任何地方都很有用。 毫無疑問,它在底層 C++(可能還有匯編程序)中特別有用。

這是因為基於 8 位字節的 CPU 架構。

自 .NET 誕生以來的現代 CPU 都是 32 位的,現在甚至是 64 位的。

因此,CPU 寄存器是 32 位(4 字節)或 64 位(8 字節)。

因此,CPU 處理的所有數據,從道路開始,內部和來自/到 memory 和主板和設備的其他組件,都是基於這種二分法:8、16、32、64 甚至 128 甚至更多在 GPU 或專用 CPU 中。

因此,對於架構和性能問題,CPU 需要使用,簡單地說,x32 系統上的 32 位寄存器和 x64 系統上的 64 位寄存器。

事實上,在 x64 系統中,具有 4 個字節的 .NET 整數使用了 64 位寄存器的一半。

64 位 CPU

英特爾® 64 和 IA-32 架構軟件開發人員手冊

現代和一般公共 CPU 是 32 位和 64 位的。 他們沒有 128 位寄存器。

因此,不可能像您建議的那樣使用 120 位 (64 + 56),除非創建一個特殊的數據結構,該結構將是繁瑣、難以管理且適得其反,性能緩慢、非常緩慢。

.NET 用於對 4 字節的decimal四個整數進行編碼,以實現與 x32 系統的 32 位兼容性,以防您想問為什么不使用long

最后一句話:我們將使用 128 位 CPU 的那一天,也許另一種十進制類型將使用完全原生支持的寄存器進行十進制計算,那一天,尾數可能會按照您的希望進行優化,例如 float 和 double :)

https://referencesource.microsoft.com/#mscorlib/system/decimal.cs

https://github.com/mono/mono/blob/master/mcs/class/corlib/corert/Decimal.cs

關於int flags和位的使用,我不知道它是如何管理的,但也許我可以假設它是出於優化原因。 也許它使用了浮點運算和尾數能力的CPU計算,或者沒有,我根本不知道。

https://en.wikipedia.org/wiki/Floating-point_arithmetic

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM