我知道如果您不了解二进制文件,BCD就像更直观的数据类型。 但我不知道为什么要使用这种编码,因为它浪费了很多意义 4比特的表示(当表示大于9时)。
另外我认为x86只支持add和subs(你可以通过FPU转换它们)。
这可能来自旧机器或其他架构吗?
谢谢!
答案 0 :(得分:11)
BCD算法对于精确的十进制计算很有用,这通常是财务应用程序,会计等的要求。它还使得乘以10除以10的幂更容易。现在有更好的选择。
有一个很好的Wikipedia article讨论了赞成和反对。
答案 1 :(得分:9)
当某个输出设备显示寄存器中的值时,BCD在电子频谱的极低端非常有用。例如,假设您有一个计算器,其中包含多个显示数字的七段显示。如果每个显示器由单独的位控制,则很方便。
现代x86处理器可能会在具有这些显示器的设备中使用似乎难以置信,但x86以 long 方式返回,并且ISA保持了大量的向后兼容性。
答案 2 :(得分:6)
BCD在空间方面是浪费的,这是正确的,但它具有“固定音高”格式的优势,可以轻松找到特定数字的第n位数。
另一个优点是允许对任意大小的数字进行精确算术计算。此外,使用上面提到的“固定间距”特性,这种算术运算很容易被分成多个线程(并行处理)。
答案 3 :(得分:5)
BCD存在于现代x86 CPU中,因为它是在最初的8086处理器中,并且所有x86 CPU都是8086兼容的。 x86中的BCD操作用于支持业务应用程序。处理器本身的BCD支持已不再使用了。
请注意,BCD是十进制数的精确表示,浮点数不是,并且在硬件中实现BCD比实现浮点要简单得多。当处理器的晶体管数不到一百万,运行在几兆赫兹时,这些事情就更加重要了。
答案 4 :(得分:5)
我认为BCD对许多事情很有用,原因如上所述。似乎被忽略的一件显而易见的事情是提供从二进制到BCD的指令,反之亦然。这对于将算术转换为二进制的ASCII数非常有用。
其中一张海报错误地说,数字经常以ASCII格式存储,实际上很多二进制数存储都是因为效率更高而完成。将ASCII转换为二进制有点复杂。 BCD有点介于ASCII和二进制之间,如果有bsdtoint和inttobcd指令,那么转换就非常容易。必须将所有ASCII值转换为二进制以用于算术。因此,BCD在ASCII到二进制转换中实际上很有用。
答案 5 :(得分:3)
如今,以二进制格式存储数字并将其转换为十进制格式以进行显示是很常见的,但转换确实需要一些时间。如果要显示数字的主要目的,或者要添加到将要显示的数字,则以十进制格式执行计算比执行二进制计算并转换为十进制更为实际。许多具有数字读数的设备和许多视频游戏都以打包的BCD格式存储数字,每个字节存储两个数字。这就是为什么许多得分计数器在1,000,000点溢出而不是一些二次幂值的原因。如果硬件不支持打包BCD算法,则替代方法不是使用二进制,而是使用解压缩的十进制。在打包时将打包的BCD转换为解压缩的十进制数,一次可以很容易地完成一个数字。相比之下,将二进制转换为十进制要慢得多,并且需要对整个数量进行操作。
顺便提一下,8086指令集是我见过的唯一一个“ASCII调整分区”和“ASCII调整乘法”的指令,其中一个指令乘以一个字节乘以十,另一个除以十。奇怪的是,值“0A”是机器指令的一部分,用不同的数字代替将导致这些指令乘以或除以其他数量,但指令没有记录为通用的乘法/除常数指令。我想知道为什么这个功能没有记录,因为它可能有用吗?
注意处理器用于添加或减去打包BCD的各种方法也很有趣。许多人执行二进制加法,但使用一个标志来跟踪在加法期间是否从第3位到第4位发生进位;然后他们可能希望代码清理结果(例如PIC),提供操作码以清除加法而不是减法,提供一个操作码来清除加法,另一个用于减法(例如x86),或者使用一个标志来跟踪是否为最后一个操作是加法或减法,并使用相同的操作码来清理两者(例如Z80)。一些使用单独的操作码用于BCD算术(例如68000),并且一些使用标志来指示加/减操作是否应该使用二进制或BCD(例如6502导数)。有趣的是,原始6502以与二进制数学相同的速度执行BCD数学运算,但是它的CMOS衍生物需要额外的BCD操作周期。
答案 6 :(得分:2)
我确信之前链接的Wiki文章更详细,但我在IBM大型机编程(PL / I)中使用了BCD。 BCD不仅保证您可以查看字节的特定区域以查找单个数字 - 这有时是有用的 - 而且还允许硬件应用简单的规则来计算所需的精度和比例,例如:将两个数字相加或相乘。
我记得,有人告诉我,在大型机上,BCD的支持是在硬件中实现的,那时,我们是表示浮点数的唯一选择。 (我们谈了18年就到了!)
答案 7 :(得分:1)
当我30多年前在大学读书时,我被告知BCD(COBOL中的COMP-3)格式良好的原因。
这些原因都与现代硬件无关。我们有快速的二进制定点算法。我们不再需要通过向每个BCD数字添加偏移量来将BCD转换为可显示格式。我们很少将数字存储为每位8位,因此BCD每位只需要4位这一事实并不是很有趣。
BCD是遗物,应该留在过去,它属于它。
答案 8 :(得分:0)
很少有人可以用hexa表示大小的数量,因此显示或至少允许以十进制查看中间结果很有用。特别是在金融或会计领域。
答案 9 :(得分:0)
现代计算强调编码捕获设计逻辑,而不是在这里或那里优化几个cpu周期。保存的时间和/或内存的值通常不值得编写特殊的位级例程。
话虽如此,BCD仍然偶尔有用。
我能想到的一个例子就是当你有一个庞大的数据库平面文件或其他像ASCII这样的ASCII格式的大数据时。如果您所做的一切都是在某些限制之间寻找价值,那么BCD真棒。要在扫描所有数据时转换所有数据,这将大大增加处理时间。