我想知道为什么计算机需要二进制代码转换器才能从BCD转换为Excess-3。为什么计算机只能使用一种形式的二进制代码。
答案 0 :(得分:0)
即使在使用更新的“更好”的表单后,一些旧的二进制表示形式仍然存在。例如,仍在使用的遗留硬件运行遗留代码,重写成本太高。字长在计算的早期没有标准化,因此字长从5到12位不等的机器自然会需要不同的方案来表示相同的数字。
在某些情况下,公司可能会坚持使用特定的表示形式来实现自我兼容性(即,与公司的旧产品一起),或者因为这是一种根深蒂固的习惯或“公司方式”。例如,在摩托罗拉和PowerPC芯片中使用big-endian表示与在Intel芯片中使用little-endian表示。 (虽然注意许多PowerPC处理器都支持两种类型的字节序,即使制造商通常只在产品中使用一种。)
前一段仅涉及字节排序,但这仍然是数据交换的问题。
即使对于BCD,也有许多方法可以存储它(例如,每个字1个BCD数字,或每个字节打包2个BCD数字)。 IBM有一个名为zoned decimal的聪明表示,它在高阶nybble中存储一个值,它与低阶nybble中的BCD值组合,形成一个代表该值的EBCDIC字符。如果您与使用EBCDIC而不是ASCII(并使用BCD而不是2的补码或无符号二进制)表示字符的概念结合,这非常有用。
切向相关:在执行算术运算之前,20世纪60年代的IBM大型机显然将BCD转换为名为qui-binary的中间形式,然后将结果转换回BCD。这是一种Rube Goldberg的装置,但根据链接的文章,中间形式提供了一些错误检测的好处。
IBM System / 360(可能是一堆较新的机器)支持打包的BCD和纯二进制表示,但你必须注意IBM的命名 - 我听说旧的IBMer将BCD称为“二进制”,和纯二进制(无符号,2的补码,无论如何)为“二进制编码的十六进制”。这提供了很大的灵活性;有些数据自然可以用一种格式表示,有些则在另一种格式中,机器提供了方便地在表格之间进行转换的说明。
在浮点运算的情况下,有些值不能在二进制浮点中精确表示,但可以使用BCD或类似表示。例如,数字0.1没有精确的二进制浮点等效值。这就是为什么BCD和定点算术首选用于代表货币数量的东西,你需要精确地表示$ 3.51这样的东西,并且在添加时不能允许浮点错误进入。
预期的应用很重要。与CPU中的固定宽度寄存器(例如,Java的BigDecimal
类)相比,任意精度算法将需要不同的表示策略。许多语言支持任意精度(例如,Scheme,Haskell),尽管任意精度数的底层实现是变化的。老实说,我不确定什么是任意精度,BCD类型方案或更密集的纯二进制表示更可取。对于Java的BigDecimal
,从二进制浮点到BigDecimal
的转换最好通过首先转换为String来完成 - 这使得这样的转换可能效率低下,所以你真的需要提前知道是否{ {1}}或float
足够好,或者你是否真的需要任意精度,以及何时。
另一个切线:Groovy,一种JVM语言,悄悄地将代码中的所有浮点数字文字视为double
值,并使用BigDecimal
算术优先于BigDecimal
或{{1} }。这就是Groovy深受保险业欢迎的原因之一。
tl; dr没有一种通用的数字数据类型,只要情况仍然如此(可能是宇宙的热死亡),您需要在表示之间进行转换。