我知道如果你不懂二进制,BCD 类型可能更加直观。 但我不知道为什么要使用这种编码方式,因为当表示大于 9 时,它会浪费 4 比特的空间。
此外,我认为 x86 只直接支持加减运算(可以通过 FPU 进行转换)。
这可能是来自旧机器或其他体系结构的限制吗?
我知道如果你不懂二进制,BCD 类型可能更加直观。 但我不知道为什么要使用这种编码方式,因为当表示大于 9 时,它会浪费 4 比特的空间。
此外,我认为 x86 只直接支持加减运算(可以通过 FPU 进行转换)。
这可能是来自旧机器或其他体系结构的限制吗?
BCD算术对于精确的十进制计算非常有用,通常在金融应用、会计等方面是必需的。它还使得乘以/除以10的幂等操作更容易。但现在有更好的替代方案。
有一篇很好的维基百科文章讨论了其利弊。
BCD在电子技术领域的极低端非常有用,当寄存器中的数值由某个输出设备显示时,它就能派上用场。例如,假设你有一台计算器,它有多个七段显示器用于显示数字。如果每个显示器都由单独的位控制那就很方便了。
虽然现代的x86处理器被用于这种类型的显示设备似乎不太可能,但x86已经存在了很长时间,并且ISA保持了很高的向后兼容性。
BCD自从原始的8086处理器就存在于现代x86 CPU中,所有的x86 CPU都兼容8086。在x86中,BCD运算用于支持早期的商业应用程序。现在,处理器本身中的BCD支持已不再实际使用。
请注意,BCD是十进制数的精确表示,而浮点数不是,硬件实现BCD比实现浮点数简单得多。这些问题在处理器只有不到一百万个晶体管且运行速度只有几兆赫时更加重要。
BCD虽然在空间上浪费,但它有一个优点,那就是它是一种"定长"格式,这使得在特定数字中找到第n个数字变得容易。
另一个优点是它允许对任意大小的数字进行精确算术计算。此外,使用上述提到的"定长"特性,这样的算术运算可以轻松地分成多个线程(并行处理)。
FBLD
和FLSTP
用于加载和存储BCD数字。一些现代架构具有十进制浮点数的硬件支持,例如Power6和IBM z10。 - phuclv当我在30多年前上大学时,我被告知BCD(COBOL中的COMP-3)是一个好的格式的原因。
现代硬件已经不再需要这些理由。我们有快速的二进制定点算术。我们不再需要通过为每个BCD数字添加偏移量来将BCD转换为可显示格式。我们很少将数字存储为每个数字8位,因此BCD每个数字只占用4位并不是非常有趣。
BCD是一个过时的遗物,应该留在过去。
现代计算强调编码捕捉设计逻辑,而非优化一点点CPU周期。省下的时间和/或内存的价值往往不值得写特殊的位级程序。
话虽如此,BCD仍然偶尔有用。
我能想到的一个例子是当你拥有一个巨大的数据库、平面文件或其他类似的大数据,它们以CSV等ASCII格式呈现。如果你只是在查找某些限制之间的值,BCD将非常有用。 如果在扫描所有这些数据时转换所有值将大大增加处理时间。
很少有人能够理解十六进制表示的数值大小,因此在金融或会计领域中,显示或至少允许查看十进制的中间结果非常有用。
BigDecimal
类型 - 这样肯定会很快。我不确定有什么比使用硬件数据类型更好的选择。 - S.Lott